首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python中列表的‘Zip字典

Python中列表的‘Zip字典
EN

Stack Overflow用户
提问于 2014-02-21 09:46:34
回答 3查看 9.7K关注 0票数 9

我有一个列表字典,我想将它们合并成一个名称元组列表。我想要第一个元组中所有列表的第一个元素,第二个元素在第二个元组中等等。

示例:

代码语言:javascript
复制
{'key1': [1, 2, 3], 'key2': [4, 5, 6], 'key3': [7, 8, 9]}

我希望得到的列表是这样的:

代码语言:javascript
复制
[('key1': 1, 'key2': 4, 'key3': 7), 
('key1': 2, 'key2': 5, 'key3': 8), 
('key1': 3, 'key2': 6, 'key3': 9)]

我想有一种优雅的方法可以做到这一点?

编辑:

我比较了@Steve Jessop的名字和@Ashwini Chaudhary的字典版本的运行时间,前者的速度要快一些:

代码语言:javascript
复制
d = {key: numpy.random.random_integers(0, 10000, 100000) 
        for key in ['key1', 'key2', 'key3']}

平均100次跑步中:

代码语言:javascript
复制
namedtuple and map: 0.093583753109
namedtuple and zip: 0.119455988407
dictionary and zip: 0.159063346386
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-02-21 10:13:12

先拿钥匙。在这个阶段你可以对它们进行排序或者任何你喜欢的东西。也许您知道按什么顺序使用什么键,所以不需要检查数据。

代码语言:javascript
复制
keys = list(d.keys())

定义命名元组:

代码语言:javascript
复制
Record = collections.namedtuple('Record', keys)

并行迭代所有列表:

代码语言:javascript
复制
[Record(*t) for t in zip(*(d[k] for k in keys))]

或者list(map(Record, *(d[k] for k in keys))),如果你喜欢map

注意,如果keys只是list(d.keys()),那么您可以使用d.values()代替(d[k] for k in keys),因为即使字典中的键顺序是任意的,它也保证与值的顺序相同。因此,如果您不关心namedtuple中字段的顺序,那么它简化为:

代码语言:javascript
复制
Record = collections.namedtuple('Record', d.keys())
[Record(*t) for t in zip(*(d.values()))]

或者list(map(Record, *d.values())),如果你喜欢map

票数 8
EN

Stack Overflow用户

发布于 2014-02-21 09:48:49

代码语言:javascript
复制
>>> d = {'key1': [1, 2, 3], 'key2': [4, 5, 6], 'key3': [7, 8, 9]}
>>> keys = d.keys()
>>> [dict(zip(keys, vals)) for vals in zip(*(d[k] for k in keys))]
[{'key3': 7, 'key2': 4, 'key1': 1},
 {'key3': 8, 'key2': 5, 'key1': 2},
 {'key3': 9, 'key2': 6, 'key1': 3}]
票数 11
EN

Stack Overflow用户

发布于 2021-10-15 00:57:54

根据乔杜里的回答,我开发了一个基于发电机的解决方案。这可能会有帮助,当迪克特是巨大的。

代码语言:javascript
复制
def zip_dict(d):
    for vals in zip(*(d.values())):
        yield dict(zip(d.keys(), vals))

示例用法:

代码语言:javascript
复制
d = dict(
    x=[1,3,5,7,9],
    y=[2,4,6,8,10]
)

for t in zip_dict(d):
    print(t)

其结果将是:

代码语言:javascript
复制
{'x': 1, 'y': 2}
{'x': 3, 'y': 4}
{'x': 5, 'y': 6}
{'x': 7, 'y': 8}
{'x': 9, 'y': 10}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21930705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档