【问题标题】:Dict Comprehension with index带索引的字典理解
【发布时间】:2021-01-27 15:37:16
【问题描述】:
如何使用字典推导获得这段代码的等效结果?
dict_sq = dict()
i = 0
for y in range(grid_height):
for x in range(grid_height):
dict_sq[i] = (x, y)
i = i + 1
{0: (0, 0), 1: (1, 0), 2: (2, 0), 3: (0, 1), 4: (1, 1), 5: (2, 1 ), 6: (0, 2), 7: (1, 2), 8: (2, 2)}
【问题讨论】:
标签:
python
dictionary
indexing
dictionary-comprehension
【解决方案1】:
作为另一个答案的替代方法,我使用列表理解和enumerate 将其映射到字典。
dict(enumerate((x, y) for y in range(grid_height) for x in range(grid_height)))
【解决方案2】:
使用itertools.product 创建一个迭代两个范围的迭代器,然后使用enumerate 为该迭代器添加索引:
from itertools import product
dict_sq = {i: (x, y)
for (i, (y, x)) in enumerate(product(range(grid_height), range(grid_height)))}
由于范围相同,您可以使用repeat=2 而不是两次写入范围:
from itertools import product
dict_sq = {i: (x, y)
for (i, (y, x)) in enumerate(product(range(grid_height), repeat=2))}
【解决方案3】:
这应该做你想做的事(迭代 x 和 y 并从中计算 i = x + grid_height * y):
grid_height = 3
dct = {x + grid_height * y:
(x, y) for y in range(grid_height) for x in range(grid_height)}
或者你可以反过来(迭代i并从中获取x = i//grid_height和)y = i%grid_height):
dct = {i: (i//grid_height, i%grid_height) for i in range(grid_height**2)}