更新以更加清晰
我有三个词典列表,我希望根据值合并为一个词典。
列表看起来像这样。它们可以有多少字典。
unplanned = [{'service__name': u'Email', 'service_sum': 4}, {'service__name': u'Peoplesoft', 'service_sum': 2}]
planned = [{'service__name': u'Email', 'service_sum': 2}, {'service__name': u'Gopher', 'service_sum': 2}, {'service__name': u'Peoplesoft', 'service_sum': 4}]
emerg = [{'service__name': u'Internet', 'service_sum': 1}]
我想获取3个列表,并创建一个新列表,其中包含来自所有3个列表的名称,以及设置顺序中的值或0。所以我在想这样的事情。
[(Email, (4, 2, 0)), (Peoplesoft, (2, 4, 0)), Gopher, (0, 2, 0)), Internet, (0, 0, 1))]
我认为我应该创建一个service__name列表来与每个列表进行比较,所以我这样做但是我不确定如何将3个列表与此名称列表进行比较。我认为izip_longest可以工作,但不知道如何实现它。我使用的是2.7。
答案 0 :(得分:2)
只需使用dict,然后将其转换为列表:
some_list = [{'service__name': u'Email', 'service_sum': 4}, {'service__name': u'Email', 'service_sum': 1}, {'service__name': u'Network', 'service_sum': 0}]
def combine(list):
combined = {}
for item in list:
if item['service__name'] not in combined:
combined[item['service__name']] = []
combined[item['service__name']].append(item['service_sum'])
return combined.items()
combine(some_list) # [(u'Email', [4, 1]), (u'Network', [0])]
combine(unplanned)
combine(emerg + planned)
.....
以下是使用defaultdict的函数的版本:
def combine(list):
from collections import defaultdict
combined = defaultdict(list)
for item in list:
combined[item['service__name']].append(item['service_sum'])
return combined.items()
有点干净,但是如果更改了函数定义(参见注释),将来可能会弹出一些不必要的导入和一些其他问题。
答案 1 :(得分:1)
看起来你可以做类似的事情:
output = []
for dicts in zip(unplanned,planned,emerg):
output.append(('Email',tuple(d['service_sum'] if d['service__name'] == 'Email' else 0 for d in dicts)))
答案 2 :(得分:0)
请尝试以下代码。你可以给变量更好的名称,因为你对上下文有了更好的了解。
def convert(unplanned, planned, emerg):
chain = (unplanned, planned, emerg)
names = map(lambda lst: [d['service__name'] for d in lst], chain)
sums = map(lambda lst: [d['service_sum'] for d in lst], chain)
ds = [dict(zip(n, s)) for n,s in zip(names, sums)]
unique_names = set([])
unique_names = reduce(unique_names.union,names)
results = []
for n in unique_names:
s = []
for i in range(3):
s.append(ds[i].get(n,0))
results.append((n, tuple(s)))
return results
print convert(unplanned, planned, emerg)
我机器的输出是
[(u'Internet', (0, 0, 1)), (u'Peoplesoft', (2, 4, 0)), (u'Email', (4, 2, 0)), (u'Gopher', (0, 2, 0))]