Python中的'Zip'列表字典

时间:2014-02-21 09:46:34

标签: python list dictionary

我有一个列表字典,我想将它们合并到一个namedtuples列表中。我想要第一个元组中所有列表的第一个元素,第二个元素中的第二个元素,依此类推。

示例:

{'key1': [1, 2, 3], 'key2': [4, 5, 6], 'key3': [7, 8, 9]}

我希望结果列表如下:

[('key1': 1, 'key2': 4, 'key3': 7), 
('key1': 2, 'key2': 5, 'key3': 8), 
('key1': 3, 'key2': 6, 'key3': 9)]

我认为这有一种优雅的方式吗?

修改

我已经将@Steve Jessop的namedTuple答案的运行时间与@Ashwini Chaudhary的字典版本进行了比较,前者有点快:

d = {key: numpy.random.random_integers(0, 10000, 100000) 
        for key in ['key1', 'key2', 'key3']}

平均。 100次运行:

namedtuple and map: 0.093583753109
namedtuple and zip: 0.119455988407
dictionary and zip: 0.159063346386

2 个答案:

答案 0 :(得分:5)

>>> 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}]

答案 1 :(得分:5)

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

keys = list(d.keys())

定义命名元组:

Record = collections.namedtuple('Record', keys)

并行迭代所有列表:

[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中字段的顺序,那么它简化为:

Record = collections.namedtuple('Record', d.keys())
[Record(*t) for t in zip(*(d.values()))]

list(map(Record, *d.values()))如果您喜欢map