2012-11-29 60 views
3

Python3:结合项目列表

dct = {'Mazda': [['Ford', 95], ['Toyota', 20], ['Chrysler', 52], ['Toyota', 5], ['Toyota', 26]]} 

我的价值观是一个列表内的名单上面的字典。我想要做的是将列表中的项目相同,并将整数添加到该值。

例如。因为丰田是有3倍,那么所有的数字结合在一起,给我另一个列表

[Toyota, 51] 

最终的结果应该是 并不需要在此顺序

dct = {'Mazda': [['Ford', 95], ['Toyota', 51], ['Chrysler', 52]]} 
+1

如果他们的汽车名称最终是独一无二的,那么应该使其成为一个字典而不是嵌套列表。 – Aesthete

回答

0

商店两份清单:一个汽车名称和数字。遍历字典中的列表,如果汽车还没有在列表中添加一个新元素,或者将该号码添加到汽车索引中。最后,zip()这两个名单在一起。

3

对于问题的输入:

dct = {'Mazda': [['Ford', 95], ['Toyota', 20], ['Chrysler', 52], 
       ['Toyota', 5], ['Toyota', 26]]} 

试试这个:

from collections import defaultdict 

for k, v in dct.items(): 
    aux = defaultdict(int) 
    for car, num in v: 
     aux[car] += num 
    dct[k] = map(list, aux.items()) 

现在dct包含了预期的结果:

dct 
=> {'Mazda': [['Ford', 95], ['Toyota', 51], ['Chrysler', 52]]} 
0
dct = {'Mazda': [['Ford', 95], ['Toyota', 20], ['Chrysler', 52], ['Toyota', 5], ['Toyota', 26]]} 

newdct = {} 
for item in dct: 
    newdct[item] = [] 
    unqItems = {} 
    for val in dct[item]: 
     if val[0] not in unqItems: 
      unqItems[val[0]] = 0 
     unqItems[val[0]] += val[1] 
    for u in unqItems: 
     newdct[item].append([u, unqItems[u]]) 
print newdct 
0

使用itertools.groupby()

In [66]: dct = {'Mazda': [['Ford', 95], ['Toyota', 20], ['Chrysler', 52], ['Toyota', 5], ['Toyota', 26]]} 

In [67]: from itertools import groupby 

In [68]: from operator import * 

In [69]: dct = {'Mazda': [['Ford', 95], ['Toyota', 20], ['Chrysler', 52], ['Toyota', 5], ['Toyota', 26]]} 

In [70]: { x: [[k,sum(y[1] for y in g)] for k,g in groupby(sorted(dct[x]), 
               key=itemgetter(0))] for x in dct} 

Out[70]: {'Mazda': [['Chrysler', 52], ['Ford', 95], ['Toyota', 51]]}