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

时间:2019-06-11 16:31:59

标签: python python-3.x dictionary range python-3.7

我希望将值作为分配给键的整数,但是当我将整数生成为值时,我创建了一个对象。

这是我的代码:

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, ...}

3 个答案:

答案 0 :(得分:1)

改为使用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}

答案 1 :(得分:1)

您可以使用字典理解:

Repository

输出:

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)

答案 2 :(得分:0)

  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在列表之间创建项目映射,并返回元组列表。当我们使用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}