Range() 函数将字典中的整数(值)更改为对象

Range() function change integers (values) in dictionary to objects

我想将值作为整数分配给键,但是当我生成整数作为值时,我创建了一个对象而不是它。

这是我的代码:

prices_for_letters = dict.fromkeys(string.ascii_lowercase, (i for i in range(1, 27)))

实际结果:

{'a': <generator object main.<locals>.<genexpr> at 0x0000022AB7EF6D68>, 
 'b': <generator object main.<locals>.<genexpr> at 0x0000022AB7EF6D68>
 ...}

预期结果:

{'a': 1, 'b': 2, ...}

改用zip

import string
prices_for_letters = dict(zip(string.ascii_lowercase, range(1,27)))
print(prices_for_letters)
#{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 
# 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 
# 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 
# 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26}

你可以使用字典理解:

from pprint import pprint
from string import ascii_lowercase

prices_for_letters = {ascii_lowercase[i]: i+1 for i in range(26)}
pprint(prices_for_letters)

输出:

{'a': 1,
 'b': 2,
 'c': 3,
 'd': 4,
 'e': 5,
 'f': 6,
 'g': 7,
 'h': 8,
 'i': 9,
 'j': 10,
 'k': 11,
 'l': 12,
 'm': 13,
 'n': 14,
 'o': 15,
 'p': 16,
 'q': 17,
 'r': 18,
 's': 19,
 't': 20,
 'u': 21,
 'v': 22,
 'w': 23,
 'x': 24,
 'y': 25,
 'z': 26}
  1. 您的代码问题的解释:

您似乎想使用列表推导式,但最终得到的是 (i for i in range(1, 27)),它会生成一个生成器,该生成器仅在迭代期间逐一加载每个项目,而不是提前生成整个列表.它有利于保存记忆,但这不是你想要的。因此,您应该为第二个参数使用列表理解,如下所示。

>>> [i for i in range(1, 27)]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

当你按照下面的方式修复后,你仍然得不到你想要的...

>>> prices_for_letters = dict.fromkeys(list(string.ascii_lowercase), [i for i in range(1, 27)])
>>> prices_for_letters
{'a': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'b': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'c': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'd': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
...
'w': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'x': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'y': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26],
'z': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]}

这是因为您使用的 dict.fromkeys() 方法将第一个参数中的每个项目映射到第二个参数。在这种情况下,整个列表被分配给每个键。

这不是您想要的,这就是您必须使用 zip 的原因,如下所示:

>>> prices_for_letters = dict(zip(list(string.ascii_lowercase), [i for i in range(1, 27)]))
>>> prices_for_letters
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7,
'h': 8, 'i': 9, 'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14,
'o': 15, 'p': 16, 'q': 17, 'r': 18, 's': 19, 't': 20, 'u': 21,
'v': 22, 'w': 23, 'x': 24, 'y': 25, 'z': 26}

zip 创建列表和 returns 元组列表之间的项目映射。当我们使用 dict(the_tuple) 显式地将元组转换为字典时,元组的第一项成为键,另一项成为值。但是,这还不够好;代码太多了。我建议的解决方案如下。

  1. 建议的解决方案
>>> prices_for_letters = dict(zip(string.ascii_lowercase, range(1,27)))
>>> prices_for_letters
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'h': 8, 'i': 9, 
'j': 10, 'k': 11, 'l': 12, 'm': 13, 'n': 14, 'o': 15, 'p': 16, 'q': 17,
'r': 18, 's': 19, 't': 20, 'u': 21, 'v': 22, 'w': 23, 'x': 24, 'y': 25,
'z': 26}