2016-05-01 24 views
5

मैं की तरह tuples की एक सूची है:पाइथन में शब्दकोशों के शब्दकोशों के लिए टुपल्स की एक सूची को कैसे परिवर्तित करें?

[(1, 'a', 22), (2, 'b', 56), (1, 'b', 34), (2, 'c', 78), (3, 'd', 47)] 

और मैं इसे करने के लिए बदलने की आवश्यकता:

{1: {'a': 22, 'b': 34}, 2: {'b': 56, 'c': 78}, 3: {'d': 47}} 

अजगर में है कि संभव है? धन्यवाद!

+0

आप कर सकते हैं 'defaultdict' – gdlmx

उत्तर

8

उपयोग एक defaultdict:

from collections import defaultdict 

l = [(1, 'a', 22), (2, 'b', 56), (1, 'b', 34), (2, 'c', 78), (3, 'd', 47)] 

d = defaultdict(dict) 
for x, y, z in l: 
    d[x][y] = z 
+0

आज़माएं जो मैं चाहता हूं। धन्यवाद! – Malgi

5

setdefault अपने दोस्त है:

d = {} 
for t in l: 
    d.setdefault(t[0],{})[t[1]]=t[2] 
4

आप एक (बल्कि लंबे समय तक) लाइन में यह करने के लिए चाहते हैं, आप itertools.groupby उपयोग कर सकते हैं, लेकिन याद रखें कि इस काम के लिए कुंजी द्वारा sorted होना चाहिए:

>>> lst = [(1, 'a', 22), (2, 'b', 56), (1, 'b', 34), (2, 'c', 78), (3, 'd', 47)] 
>>> {key: {v[1]: v[2] for v in vals} for key, vals in itertools.groupby(sorted(lst), key=operator.itemgetter(0))} 
{1: {'a': 22, 'b': 34}, 2: {'b': 56, 'c': 78}, 3: {'d': 47}} 
+0

मजेदार तथ्य: '{v [1]: v [2] v vals में v के लिए}' ठीक है जब तक 'dict (ज़िप (* ज़िप (* vals) [1:])) '(लेकिन शायद अधिक प्रदर्शनकर्ता और पठनीय: डी) – schwobaseggl

संबंधित मुद्दे