python - 是否有一种 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 嵌套循环。还有另一种方法吗?
解决方案
是的,您可以用一次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}]
这个怎么运作 -
- 对于每个键:值对(例如,
"x": (0, 2)
),将其展平以形成元组列表(例如,[("x", 0), ("x", 1)]
)。每对都有一份清单 - 取笛卡尔
product
。你得到一个元组列表的迭代器 - 对于每个迭代器,使用以下方法将元组列表转换为字典
map
- 列出整个结果
推荐阅读
- javascript - 使用 Ajax 更改 div 的颜色
- java - java.lang.IllegalArgumentException:无效通知(没有有效的小图标)
- c++ - 如何区分构造函数
- sql - 如果任何列为空,则返回一个空字符串
- python - 当我将 python3.7 降级到 python3.6 时,查找“virtualenvwrapper.hook_loader”的模块规范时出错
- ios - 由于分发预配问题,Xamarin.forms iOS 安装失败
- angular - Angular9:project ng new -> Disk 0(C:) 达到 100%
- c - 如何使不完整的数组/结构初始化成为错误或警告?
- php - NEXMO:通过 nexmo 向 facebook 发送消息时出现内容类型错误
- laravel - 为什么我在 Laravel 5.5 上的更新图像不起作用?