2017-09-19 97 views
1

我有兩個列表:把相同字典鍵的值在一組在python

list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5]
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l']

dictionary=dict(zip(list1,list2)) 

我想輸出相同的鍵的值在一個用於每個鍵這樣因爲它會像這樣打印:

0 ['a','b','c'] 
1 ['d','e'] 
2 ['f','k'] 
3 ['o','n'] 
4 ['q','t'] 
5 ['z','w','l'] 

我寫了下面的代碼來做到這一點,但它不工作作爲我th墨水

for k,v in dictionary.items(): 

    print (k,v) 

你能告訴我如何修復代碼,以便我可以得到高於預期的結果嗎? 在此先感謝!

+0

什麼是'dictionary'? – HyperNeutrino

+0

你可以顯示你創建你的字典的地方嗎? – Legman

+0

對不起,我第一次忘記了,我已經更新了我的代碼@Legman –

回答

3

關於你的代碼:

dictionary = dict(zip(list1, list2)) 

創建詞典:

{0: 'c', 1: 'e', 2: 'k', 3: 'n', 4: 't', 5: 'l'} 

哪個完全失去每組中的最後一個值。您需要處理壓縮列表以構建分組數據。有兩種方法,分別是itertools.groupby()defaultdict(list),如下所示。

使用列表中的collections.defaultdict可以將項目與來自list1的鍵和來自list2的值分組。從配對每個列表中的項目與zip()

from collections import defaultdict 

list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5] 
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l'] 

d = defaultdict(list) 

for k,v in zip(list1, list2): 
    d[k].append(v) 

for k in sorted(d): 
    print('{} {!r}'.format(k, d[k])) 

輸出:

 
0 ['a', 'b', 'c'] 
1 ['d', 'e'] 
2 ['f', 'k'] 
3 ['o', 'n'] 
4 ['q', 't'] 
5 ['z', 'w', 'l'] 

因爲在字典中的項目是無序的,輸出由鍵排序。

3

您顯示的代碼看起來不像您所描述的那樣。

這且不說,你可以先荏苒列表,然後用collections.defaultdict分組相同的密鑰的值相同的鍵組值加在一起:

from collections import defaultdict 

d = defaultdict(list) 
for k, v in zip(list1, list2): 
    d[k].append(v) 
print(d) 
# defaultdict(<type 'list'>, {0: ['a', 'b', 'c'], 1: ['d', 'e'], 2: ['f', 'k'], 3: ['o', 'n'], 4: ['q', 't'], 5: ['z', 'w', 'l']}) 
3

可以使用itertool.groupby的簡潔,一個在線解決方案:

import itertools 
list1=[0,0,0,1,1,2,2,3,3,4,4,5,5,5] 
list2=['a','b','c','d','e','f','k','o','n','q','t','z','w','l'] 
final_list = {a:[i[-1] for i in list(b)] for a, b in itertools.groupby(zip(list1, list2), key=lambda x: x[0])} 
for a, b in final_list.items(): 
    print(a, b) 

輸出:

0 ['a', 'b', 'c'] 
1 ['d', 'e'] 
2 ['f', 'k'] 
3 ['o', 'n'] 
4 ['q', 't'] 
5 ['z', 'w', 'l'] 
相關問題