首页 > 解决方案 > 是否有一种 Python 的方式来迭代范围字典以构建新字典?

问题描述

假设 a 有这个带有键和一些范围的字典:

d = {"x": (0, 2), "y": (2, 4)}

我需要使用上面的范围创建字典,我会得到:

>>> keys = [k for k,v in d.items()]
>>> 
>>> def newDict(keys,array):
...     return dict(zip(keys,array))
... 
>>> for i in range(0,2):
...     for j in range(2,4):
...         dd = newDict(keys, [i,j])
...         print (dd)
... 
{'x': 0, 'y': 2}
{'x': 0, 'y': 3}
{'x': 1, 'y': 2}
{'x': 1, 'y': 3}

我的疑问是如何使用范围迭代更改键并以更 Pythonic 的方式创建新的字典。

假设我添加了更多一个键z

d = {"x": (0, 2), "y": (2, 4), "z": (3, 5)}

所以,我需要添加更多的 for 嵌套循环。还有另一种方法吗?

标签: pythonpython-3.xloopsdictionaryiterator

解决方案


是的,您可以用一次itertools.product调用替换嵌套循环。

>>> from itertools import product
>>> p = product(*([(k, v) for v in range(*V)] for k, V in d.items()))
>>> list(map(dict, p))
[{'x': 0, 'y': 2}, {'x': 0, 'y': 3}, {'x': 1, 'y': 2}, {'x': 1, 'y': 3}]

这个怎么运作 -

  1. 对于每个键:值对(例如,"x": (0, 2)),将其展平以形成元组列表(例如,[("x", 0), ("x", 1)])。每对都有一份清单
  2. 取笛卡尔product。你得到一个元组列表的迭代器
  3. 对于每个迭代器,使用以下方法将元组列表转换为字典map
  4. 列出整个结果

推荐阅读