创建一个使用map和rang映射ascii字符的字典

2024-05-15 08:43:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在把字符映射到字典时遇到了一些问题。我要做的是

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', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}']

有人能给我解释一下如何解决这个问题,使它正确地映射出来吗。在


Tags: 函数map字典counterascii情况range字符
3条回答

您可以使用python2.7中添加的OrderedDictdictionary子类来保持键的插入顺序。这只会影响字典本身的显示方式,所有其他操作都与常规字典相同。使用它可以让你更清楚地看到它的内容(但工作方式和你以前一样,那是可以的)。在

>>> symbolMap = map(chr, range(33,64) + range (91,96) + range(123,126))
>>> symbolMap
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', 
'/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', 
'=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}']
>>> from collections import OrderedDict
>>> counter = OrderedDict((chr(c),0) for c in range(33,64) + range(91,96) + range(123,126))
>>> counter
OrderedDict([('!', 0), ('"', 0), ('#', 0), ('$', 0), ('%', 0), ('&', 0), 
("'", 0), ('(', 0), (')', 0 ), ('*', 0), ('+', 0), (',', 0), ('-', 0), 
('.', 0), ('/', 0), ('0', 0), ('1', 0), ('2', 0), ('3', 0 ), ('4', 0), 
('5', 0), ('6', 0), ('7', 0), ('8', 0), ('9', 0), (':', 0), (';', 0), 
('<', 0), ('=', 0 ), ('>', 0), ('?', 0), ('[', 0), ('\\', 0), (']', 0), 
('^', 0), ('_', 0), ('{', 0), ('|', 0), ('}', 0)])
>>> counter['#'] = counter['#']+1
>>> counter
OrderedDict([('!', 0), ('"', 0), ('#', 1), ('$', 0), ('%', 0), ('&', 0), 
("'", 0), ('(', 0), (')', 0 ), ('*', 0), ('+', 0), (',', 0), ('-', 0), 
('.', 0), ('/', 0), ('0', 0), ('1', 0), ('2', 0), ('3', 0 ), ('4', 0), 
('5', 0), ('6', 0), ('7', 0), ('8', 0), ('9', 0), (':', 0), (';', 0), 
('<', 0), ('=', 0 ), ('>', 0), ('?', 0), ('[', 0), ('\\', 0), (']', 0), 
('^', 0), ('_', 0), ('{', 0), ('|', 0), ('}', 0)])

你并不是真的说你想要字典做什么,但是从它的名字和内容来看,你似乎想要计算某些字符的出现。在Python2.7中,collections模块还有另一个名为Counter的新类,它是为此而设计的。以下是如何使用它:

^{2}$

字典打印时的顺序不是由键的值决定的,也不一定是按键的值来排列的。顺序取决于所运行的Python实现,取决于CPython的顺序取决于键的哈希值和插入顺序。在

出于所有意图和目的,您应该假设顺序是随机的。在

换句话说:你的代码是有效的!

如果将0值替换为字符数,这一点会更清楚:

>>> symbol_map = dict([(chr(x), x) for x in range(33,64) + range (91,96) + range(123,126)])
>>> symbol_map
{'!': 33, '#': 35, '"': 34, '%': 37, '$': 36, "'": 39, '&': 38, ')': 41, '(': 40, '+': 43, '*': 42, '-': 45, ',': 44, '/': 47, '.': 46, '1': 49, '0': 48, '3': 51, '2': 50, '5': 53, '4': 52, '7': 55, '6': 54, '9': 57, '8': 56, ';': 59, ':': 58, '=': 61, '<': 60, '?': 63, '>': 62, '[': 91, ']': 93, '\\': 92, '_': 95, '^': 94, '{': 123, '}': 125, '|': 124}

在这里,您可以看到每个字符都正确地映射到字符的右序数:

^{2}$

字典中的顺序没有什么区别,除非你需要按特定的顺序打印出来。在这种情况下,您可以通过排序来实现:

>>> for x in sorted(symbol_map): print x,
... 
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? [ \ ] ^ _ { | }

但是在使用它时,通常不需要在按键访问目录时对字典进行排序。在

更新:我以为这些特定的范围是有意为之,但如果您想要一般的标点和数字,请尝试以下方法:

>>> import string
>>> symbol_map = dict([(x, 0) for x in string.punctuation + string.digits])
>>> symbol_map.keys()
['!', '#', '"', '%', '$', "'", '&', ')', '(', '+', '*', '-', ',', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ';', ':', '=', '<', '?', '>', '@', '[', ']', '\\', '_', '^', '`', '{', '}', '|', '~']

与您的差别很小,例如它包括~,但仍然如此。在

我会做一些类似的事情

>>> codes = range(33,64) + range (91,96) + range(123,126)
>>> counter = dict((chr(c), 0) for c in codes)
>>> 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}

这只是将一个元组序列传递给dict类的构造函数。每个元组的第一个元素是映射中需要的字符,第二个元素是0。在

值得注意的是,这会产生与您在问题中请求的相同的输出,直到字典的顺序是无序的。你已经得到了这个输出,你的方法可能会稍微快一点,但对于一个dict这个大小,这并不重要。生成器表达式通常优先于map,并且使用dict构造函数比dict.fromkeys更规范。我所展示的方式更清楚地传达了我的意图。总之,我不知道你到底有什么问题。在

相关问题 更多 >