Python的內置itertools
模塊實際上有一個groupby
功能,您可以使用,但要進行分組的元素必須先進行排序,從而進行分組的元素在列表中是連續的:
sortkeyfn = key=lambda s:s[1]
input = [('11013331', 'KAT'), ('9085267', 'NOT'), ('5238761', 'ETH'),
('5349618', 'ETH'), ('11788544', 'NOT'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('9843236', 'KAT'), ('5594916', 'ETH'), ('1550003', 'ETH')]
input.sort(key=sortkeyfn)
現在輸入的樣子:形式的
[('5238761', 'ETH'), ('5349618', 'ETH'), ('962142', 'ETH'), ('7795297', 'ETH'),
('7341464', 'ETH'), ('5594916', 'ETH'), ('1550003', 'ETH'), ('11013331', 'KAT'),
('9843236', 'KAT'), ('9085267', 'NOT'), ('11788544', 'NOT')]
groupby
返回的2元組的序列,。我們想要的是把它變成一個「類型」是關鍵字的字典列表,而「items」是由values_iterator返回的元組的第0個元素的列表。就像這樣:
from itertools import groupby
result = []
for key,valuesiter in groupby(input, key=sortkeyfn):
result.append(dict(type=key, items=list(v[0] for v in valuesiter)))
現在result
包含您所需的字典,在你的問題說明。
但是,您可能會考慮,只是將一個單詞作爲輸入,按類型鍵入,每個值都包含值列表。在你當前的表單中,爲了找到某個特定類型的值,你需要迭代列表來查找包含匹配'type'鍵的dict,然後從中獲取'items'元素。如果您使用單個詞典而不是單項詞典列表,則可以通過在主詞典中進行單鍵查找來查找特定類型的項目。使用groupby
,這看起來像:
result = {}
for key,valuesiter in groupby(input, key=sortkeyfn):
result[key] = list(v[0] for v in valuesiter)
result
現在包含本字典(這是類似於@ KennyTM的答案中間res
defaultdict):
{'NOT': ['9085267', '11788544'],
'ETH': ['5238761', '5349618', '962142', '7795297', '7341464', '5594916', '1550003'],
'KAT': ['11013331', '9843236']}
(如果你想將這一數字減少到一行代碼,您可以:
result = dict((key,list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn))
或使用新奇的字典-理解的形式:
result = {key:list(v[0] for v in valuesiter)
for key,valuesiter in groupby(input, key=sortkeyfn)}
如何才能做到這一點,如果輸入數組有一個鍵和兩個或多個值,如:'[(「11013331」,「紅」 ,'KAT'),('9085267','blue''KAT')]'元組的最後一個元素是關鍵字,前兩個元素是值。結果應該是這樣的: result = ['KAT',items:[('11013331',red),('9085267',blue)]}] – user1144616 2012-03-06 18:52:02