Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建使用映射和范围映射ascii字符的词典_Python - Fatal编程技术网

Python 创建使用映射和范围映射ascii字符的词典

Python 创建使用映射和范围映射ascii字符的词典,python,Python,我在将字符映射到字典时遇到一些问题。我要做的是 counter = { '!': 0, '"': 0, '#': 0, '$': 0 } ... 对于十进制范围内的所有ascii字符 range(33,64) range(91,96) and range(123,126) 过了一段时间,我发现map可能被用作传递chr作为函数,列表从范围返回用于迭代 symbolMap = map(chr, range(33,64) + range (91,96) + range(123,126)) 问题

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

counter = { '!': 0, '"': 0, '#': 0, '$': 0 } ...
对于十进制范围内的所有ascii字符

range(33,64) range(91,96) and range(123,126)
过了一段时间,我发现map可能被用作传递chr作为函数,列表从范围返回用于迭代

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', ':', ';', '<', '=', '>', '?', '[', '\\', ']', '^', '_', '{', '|', '}']
>计数器
{'!': 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}
>>>人权专员(34)
'"'
>>>射程(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]
>>>符号映射
['!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '', '?', '[', '\\', ']', '^', '_', '{', '|', '}']

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

我会这样做

>>> 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}
>>代码=范围(33,64)+范围(91,96)+范围(123126)
>>>计数器=dict((chr(c),0)表示代码中的c)
>>>柜台
{'!': 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}
这只是将一系列元组传递给
dict
类的构造函数。每个元组的第一个元素是您希望在映射中使用的字符,第二个元素是0


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

我会这样做

>>> 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}
>>代码=范围(33,64)+范围(91,96)+范围(123126)
>>>计数器=dict((chr(c),0)表示代码中的c)
>>>柜台
{'!': 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}
这只是将一系列元组传递给
dict
类的构造函数。每个元组的第一个元素是您希望在映射中使用的字符,第二个元素是0


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

字典在打印时的顺序不是由键的值决定的,也不需要。顺序取决于哪个imp在CPython上,您正在运行的Python元素的顺序取决于键的散列值和插入顺序

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

换句话说:您的代码可以正常工作!

如果将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}
字典中的顺序没有区别,除非您需要按特定顺序打印。在这种情况下,您可以通过排序:

>>> for x in sorted(symbol_map): print x,
... 
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? [ \ ] ^ _ { | }
>>对于排序后的x(符号映射):打印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', ';', ':', '=', '<', '?', '>', '@', '[', ']', '\\', '_', '^', '`', '{', '}', '|', '~']
导入字符串 >>>symbol\u map=dict([(x,0)表示字符串中的x。标点符号+字符串。数字]) >>>symbol_map.keys() ['!', '#', '"', '%', '$', "'", '&', ')', '(', '+', '*', '-', ',', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ';', ':', '=', '', '@', '[', ']', '\\', '_', '^', '`', '{', '}', '|', '~']
与您的区别很小,例如,它包括
~
,但仍然是。

字典打印时的顺序不是由键的值决定的,也不需要。顺序取决于您正在运行的Python实现,取决于cpyth。顺序取决于键的哈希值和插入顺序

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

换句话说:您的代码可以正常工作!

如果将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}
字典中的顺序没有区别,除非您需要按特定顺序打印。在这种情况下,您可以通过排序:

>>> for x in sorted(symbol_map): print x,
... 
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? [ \ ] ^ _ { | }
>>对于排序后的x(符号映射):打印x,
... 
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? [ \ ] ^ _ { | }
但是,在使用它的时候,你通常不需要像使用字典一样对它进行排序