Python比较列表与Dict Valu

2024-05-16 20:41:10 发布

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

更新以使其更清晰

我有三个字典列表,我想根据一个值合并成一个。在

名单是这样的。他们可以拥有多少本词典各不相同。在

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按设定的顺序排列。所以我在想这样的事情。在

^{pr2}$

我想我应该创建一个服务名称的列表来与每个列表进行比较,所以我这样做了,但是我不确定如何将这3个列表与此名称列表进行比较。我以为伊齐普最长的时间会有效,但不知道如何实现它。我用的是2.7。在


Tags: name名称列表字典emailserviceplannedinternet
3条回答

看起来你可以做些类似的事情:

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)))

只需使用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的函数版本:

^{pr2}$

稍微干净了一点,但是有一个不必要的导入,如果函数定义被更改,那么在将来可能会出现一些其他问题(参见注释)。在

尝试以下代码。你可以给变量起一个更好的名字,因为你更了解上下文。在

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)

我机器的输出是

^{pr2}$

相关问题 更多 >