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}
- 您的代码问题的解释:
您似乎想使用列表推导式,但最终得到的是 (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)
显式地将元组转换为字典时,元组的第一项成为键,另一项成为值。但是,这还不够好;代码太多了。我建议的解决方案如下。
- 建议的解决方案
>>> 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}
我想将值作为整数分配给键,但是当我生成整数作为值时,我创建了一个对象而不是它。
这是我的代码:
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}
- 您的代码问题的解释:
您似乎想使用列表推导式,但最终得到的是 (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)
显式地将元组转换为字典时,元组的第一项成为键,另一项成为值。但是,这还不够好;代码太多了。我建议的解决方案如下。
- 建议的解决方案
>>> 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}