将值列表拆分为字典列表

2024-04-20 13:16:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个键值如下的字典:

[{"key1" : ['1', '2'], "key2" : ['john', 'marvel']}, {"key1" : ['150', '120'], "key2" : ['gandalf', 'sam']}]

我想得到这样的东西:

[ {key1 : '1', key2 : 'john'}, {key1 : '2', key2 : 'marvel'}, {key1 : '150', key2 : 'gandalf'}, {key1 : '120', key2 : 'sam'}]

我被卡住了,我想嵌入循环,但我不知道怎么做。你知道吗


Tags: 字典samjohnmarvel键值key2key1gandalf
3条回答

您可以使用list comprehension

data = [{"key1": ['1', '2'], "key2": ['john', 'marvel']}, {"key1": ['150', '120'], "key2": ['gandalf', 'sam']}]

keys = ['key1', 'key2']
result = [dict(zip(keys, items)) for d in data for items in zip(*(d[k] for k in keys))]

print(result)

输出

[{'key2': 'john', 'key1': '1'}, {'key2': 'marvel', 'key1': '2'}, {'key2': 'gandalf', 'key1': '150'}, {'key2': 'sam', 'key1': '120'}]

上述列表理解等同于以下for循环:

result = []
for d in data:
    for items in zip(*(d[k] for k in keys)):
        result.append(dict(zip(keys, items)))
result = [{}]
for item in data:
    key, val = item.split(":", 1)
    if key in result[-1]:
        result.append({})
    result[-1][key] = val

如果你总是有"key1""key2",那么:

In [1]: data = [{"key1" : ['1', '2'], "key2" : ['john', 'marvel']}, {"key1" : ['
   ...: 150', '120'], "key2" : ['gandalf', 'sam']}]
   ...:

In [2]: [{"key1":v1, "key2":v2} for d in data for (v1, v2) in zip(d['key1'], d['key2'])]
Out[2]:
[{'key1': '1', 'key2': 'john'},
 {'key1': '2', 'key2': 'marvel'},
 {'key1': '150', 'key2': 'gandalf'},
 {'key1': '120', 'key2': 'sam'}]

可以吗

更一般的方法是:

In [5]: [dict(zip(d, vs)) for d in data for vs in zip(*d.values())]
Out[5]:
[{'key1': '1', 'key2': 'john'},
 {'key1': '2', 'key2': 'marvel'},
 {'key1': '150', 'key2': 'gandalf'},
 {'key1': '120', 'key2': 'sam'}]

相关问题 更多 >