我在把字符映射到字典时遇到了一些问题。我要做的是
counter = { '!': 0, '"': 0, '#': 0, '$': 0 } ...
对于十进制范围内的所有ascii字符
^{pr2}$一段时间后,我发现map可能被用来传递chr作为函数,并从range返回list进行迭代。。。在
symbolMap = map(chr, range(33,64) + range (91,96) + range(123,126))
问题是这个映射不会腐蚀ascii表,当我尝试时,情况会变得更糟
counter = dict.fromkeys( symbolMap, 0 )
查看我的shell会话:
>>> counter
{'!': 0, '#': 0, '"': 0, '%': 0, '$': 0, "'": 0, '&': 0, ')': 0, '(': 0, '+': 0, '*': 0, '-': 0, ',': 0, '/': 0, '.': 0, '1': 0, '0': 0, '3': 0, '2': 0, '5': 0, '4': 0, '7': 0, '6': 0, '9': 0, '8': 0, ';': 0, ':': 0, '=': 0, '<': 0, '?': 0, '>': 0, '[': 0, ']': 0, '\\': 0, '_': 0, '^': 0, '{': 0, '}': 0, '|': 0}
>>> chr(34)
'"'
>>> range(33,64)
[33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]
>>> symbolMap
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}']
有人能给我解释一下如何解决这个问题,使它正确地映射出来吗。在
您可以使用python2.7中添加的
OrderedDict
dictionary子类来保持键的插入顺序。这只会影响字典本身的显示方式,所有其他操作都与常规字典相同。使用它可以让你更清楚地看到它的内容(但工作方式和你以前一样,那是可以的)。在你并不是真的说你想要字典做什么,但是从它的名字和内容来看,你似乎想要计算某些字符的出现。在Python2.7中,
^{2}$collections
模块还有另一个名为Counter
的新类,它是为此而设计的。以下是如何使用它:字典打印时的顺序不是由键的值决定的,也不一定是按键的值来排列的。顺序取决于所运行的Python实现,取决于CPython的顺序取决于键的哈希值和插入顺序。在
出于所有意图和目的,您应该假设顺序是随机的。在
换句话说:你的代码是有效的!
如果将0值替换为字符数,这一点会更清楚:
在这里,您可以看到每个字符都正确地映射到字符的右序数:
^{2}$字典中的顺序没有什么区别,除非你需要按特定的顺序打印出来。在这种情况下,您可以通过排序来实现:
但是在使用它时,通常不需要在按键访问目录时对字典进行排序。在
更新:我以为这些特定的范围是有意为之,但如果您想要一般的标点和数字,请尝试以下方法:
与您的差别很小,例如它包括
~
,但仍然如此。在我会做一些类似的事情
这只是将一个元组序列传递给
dict
类的构造函数。每个元组的第一个元素是映射中需要的字符,第二个元素是0。在值得注意的是,这会产生与您在问题中请求的相同的输出,直到字典的顺序是无序的。你已经得到了这个输出,你的方法可能会稍微快一点,但对于一个dict这个大小,这并不重要。生成器表达式通常优先于
map
,并且使用dict
构造函数比dict.fromkeys
更规范。我所展示的方式更清楚地传达了我的意图。总之,我不知道你到底有什么问题。在相关问题 更多 >
编程相关推荐