从字典列表中为另一个字典获取相同的键值

get same value for keys into another dictionary from List of Dictionary

这是我的词典列表。

d = [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

如何获得如下输出:

d_one = [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'},
         {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'}]

d_two = [{'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

从两个键区和循环的字典列表中获取不同的数据。对于相同的区域和循环对,创建一个字典列表,直到结束。

您想要filter您的数据:

d_one = filter(lambda d:d['cycle']=='15',d)
> [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'}, 
>  {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'}]

d_two = filter(lambda d:d['cycle']=='30',d)
> [{'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

一种方法是使用集合。并将您的变量('cycle')作为字典中的键。

例如:

import collections 
res = collections.defaultdict(list)
d = [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

for i in d:
    res[i["cycle"]].append(i)
print(res['15'])
print("-----")
print(res['30'])

输出:

[{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'}, {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'}]
-----
[{'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

试试 groupby,

from itertools import groupby 
from operator import itemgetter
grouper = itemgetter("cycle", "zone")
dict_one,dict_two = (list(g) for _,g in groupby(d,key=grouper))

代码将 return 一个元组,现在我们只有 2 个元素。因此,值分配将在这里起作用。如果您有更多的值,您可以将这些值分配给 dict 或存储为可迭代的。

输出

In [9]: dict_one
Out[9]: 
[{'count': '100', 'cycle': '15', 'zone': 'PIMPRI'},
 {'count': '50', 'cycle': '15', 'zone': 'PIMPRI'}]

In [10]: dict_two
Out[10]: [{'count': '150', 'cycle': '30', 'zone': 'PIMPRI'}]

为什么要为所有这些值使用单独的字典。你不能把它写到一本字典里吗?例如,

d = [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'},
     {'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]

这是我们能得到的,

res = {}
for ele in d:
    res.setdefault((ele['cycle'],ele['zone']), [])
    res[(ele['cycle'], ele['zone'])].append(ele['count'])

使用 (dct['zone'], dct['cycle']) 对作为关键字生成字典:

>>> result = {}
>>> 
>>> for dct in d:
...     result.setdefault((dct['zone'], dct['cycle']), []).append(dct)
... 
>>> result
{('PIMPRI', '15'): [{'count': '100', 'zone': 'PIMPRI', 'cycle': '15'}, {'count': '50', 'zone': 'PIMPRI', 'cycle': '15'}], ('PIMPRI', '30'): [{'count': '150', 'zone': 'PIMPRI', 'cycle': '30'}]}