2013-05-31 76 views
1

創建字典從元組名單:從列表

[('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100'), \ 
('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN')] 

我想創建一個字典,它的鍵將是每一個元組第三[0][1]值。因此,創建的字典的第一鍵應該是'IND, MIA',第二密鑰'LAA, SUN'

最終的結果應該是:

{'IND, MIA': [('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100')],\ 
'LAA, SUN': [('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN')]} 

如果這是任何相關性,一旦問題變成鍵的值,它們可以是從元組中刪除,因爲那樣我就不再需要它們了。任何建議非常感謝!

+1

爲什麼不使用元組作爲鍵,而不是字符串? ('IND','MIA')而不是'IND,MIA'。看起來更優雅,並且允許在密鑰內部使用逗號而不會混淆密鑰。 – Eli

+0

如果物品的數量不能被3整除(比較@ J0HN的沒有填充的填充和Martijn的填充izip_longest()),你會發生什麼? – jfs

回答

4
inp = [('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100'), \ 
     ('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN')] 

result = {} 
for i in range(0, len(inp), 3): 
    item = inp[i] 
    result[item[0]+","+item[1]] = inp[i:i+3] 

print (result) 

快譯通理解的解決方案是可能的,但有些凌亂。

爲了除去從數組鍵與

result[item[0]+","+item[1]] = [item[2:]]+inp[i+1:i+3] 

字典理解溶液(有點比我最初認爲:)更少凌亂)

rslt = { 
    inp[i][0]+", "+inp[i][1]: inp[i:i+3] 
    for i in range(0, len(inp), 3) 
} 

替換第二環路線(result[item[0]+ ...),並添加更多以下是一些有用的鏈接:):defaultdict,dict comprehensions

+1

這裏你不需要'defaultdict',一個普通的'dict'就可以做到。 – jfs

+1

謝謝!我以最簡潔的方式選擇詞典理解解決方案。 – nutship

+0

@ J.F.Sebastian是的,你說的對,第一個版本用剩下的列表附加來收集這些元素。謝謝。 – J0HN

2

使用itertoolsgrouper recipe

from itertools import izip_longest 

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

{', '.join(g[0][:2]): g for g in grouper(inputlist, 3)} 

應該這樣做。

grouper()方法一次給我們3組元組。

從太字典中的值刪除鍵值:

{', '.join(g[0][:2]): (g[0][2:],) + g[1:] for g in grouper(inputlist, 3)} 

演示您的輸入:

>>> from pprint import pprint 
>>> pprint({', '.join(g[0][:2]): g for g in grouper(inputlist, 3)}) 
{'IND, MIA': (('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100')), 
'LAA, SUN': (('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN'))} 
>>> pprint({', '.join(g[0][:2]): (g[0][2:],) + g[1:] for g in grouper(inputlist, 3)}) 
{'IND, MIA': (('05/30',), ('ND', '07/30'), ('UNA', 'ONA', '100')), 
'LAA, SUN': (('05/30',), ('AA', 'SN', '07/29'), ('UAA', 'AAN'))} 
+0

一如既往的責任!我希望我可以在這裏使用接受按鈕兩次。謝謝。 – nutship

1
from collections import defaultdict 
def solve(lis, skip = 0): 
    dic = defaultdict(list) 
    it = iter(lis)     # create an iterator 
    for elem in it: 
     key = ", ".join(elem[:2])  # create key 
     dic[key].append(elem) 
     for elem in xrange(skip):  # append the next two items to the 
      dic[key].append(next(it)) # dic as skip =2 
    print dic 


solve([('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100'), \ 
('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN')], skip = 2) 

輸出:

defaultdict(<type 'list'>, 
{'LAA, SUN': [('LAA', 'SUN', '05/30'), ('AA', 'SN', '07/29'), ('UAA', 'AAN')], 
'IND, MIA': [('IND', 'MIA', '05/30'), ('ND', '07/30'), ('UNA', 'ONA', '100')] 
})