我有一个字典列表,它们都有相同的键,例如
input = [
{
"animal": "Tiger"
"country": "US",
"color": "yellow-black"
},
{
"animal": "Dog"
"country": "UK",
"color": "brown"
},
{
"animal": "Tiger"
"country": "Nepal",
"color": "yellow-black"
}
]
我想创建一个新字典,将指定键(此处为动物)具有相同值的字典组合在一起。在对它们进行分组时,我想从初始词典中删除“动物”键。对于给定的示例,它会这样
output = {
"Tiger":
[{
"country": "US",
"color": "yellow-black"
},
{
"animal": "Tiger"
"country": "Nepal",
"color": "yellow-black"
}],
"Dog": [
{
"country": "UK",
"color": "brown"
}]
}
我用下面的代码实现了这一点,但是我很确定必须有一种更优雅的方法。有可能将其写成单线吗?
grouped = dict((k, list(g)) for k, g in itertools.groupby(input, key=lambda x:x['animal']))
for k, g in grouped.items():
for i in range(len(grouped)):
del g[i]['animal']
答案 0 :(得分:4)
最简单的方法可能是使用defaultdict
。我假设您实际上是要在输出中放置rootCA.cer
标记,因为您在输入中也缺少逗号,因此很可能是错字。
"animal"
根据您的词典中有多少个键/值对,可以简单地从词典中删除键,而不是使用词典理解来重建除该键之外的词典,这样会更快。对于这种大小的样本,速度的大小并不重要,也没有更改原始数据的风险。
答案 1 :(得分:2)
这是您的固定尝试-但需要进行预排序,并且效果不如defaultdict:
# fixed data
data = [ { "animal": "Tiger", "country": "US", "color": "yellow-black" },
{ "animal": "Dog", "country": "UK", "color": "brown" },
{ "animal": "Tiger", "country": "Nepal", "color": "yellow-black" } ]
from itertools import groupby
# groupby needs sorted keys if you want to group them together
grouped = dict((k, list(g)) for k, g in groupby(sorted(data,key=lambda x:x["animal"]),
key=lambda x:x['animal']))
# delete the animal key
for k in grouped:
for inner in grouped[k]:
del inner["animal"]
print(grouped)
输出:
{ 'Dog': [{'country': 'UK', 'color': 'brown'}],
'Tiger': [{'country': 'US', 'color': 'yellow-black'},
{'country': 'Nepal', 'color': 'yellow-black'}]}
Doku:
制作一个迭代器,该迭代器从迭代器中返回连续键和组。键是为每个元素计算键值的函数。如果未指定或为None,则键默认为标识函数,并返回不变的元素。通常,可迭代对象必须已经在相同的键函数上进行了排序。
答案 2 :(得分:0)
不是一个班轮,但defaultdict
是最合适的人
from collections import defaultdict
d=defaultdict(list)
for i in input:
d[i['animal']].append({k:v for k,v in i.items() if k!='animal' })