2012-11-29 87 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]]}