2017-04-05 13 views
16

मैं नेस्टेड list द्वारा dict बनाने की कोशिश:नेस्टेड सूची dict को

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

L = [{y:x[0] for y in x if y != x[0]} for x in groups] 
d = { k: v for d in L for k, v in d.items()} 

print (d) 
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'} 

लेकिन यह थोड़ा जटिल लगता है।

क्या कोई बेहतर समाधान है?

+11

मैं देख रहा हूँ तुम वहाँ क्या किया :) http://stackoverflow.com/a/43227053/5811078 – zipa

उत्तर

18

के बारे में क्या:

d = {k:row[0] for row in groups for k in row[1:]} 

यह देता है:

>>> {k:row[0] for row in groups for k in row[1:]} 
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'} 

तो तुम groups में हर row से अधिक पुनरावृति। पंक्ति का पहला तत्व मान (row[0]) के रूप में लिया जाता है और आप k सभी कुंजी प्राप्त करने के लिए row[1:] से अधिक सक्रिय करते हैं।

अजीब लग सकता है, यह अभिव्यक्ति भी काम करता है जब आप इसे खाली पंक्ति देते हैं (जैसे groups = [[],['A','B']])।

>>> groups = [[],['A','B']] 
>>> {k:row[0] for row in groups for k in row[1:]} 
{'B': 'A'} 
6

मुझे लगता है कि एक लाइन समाधान थोड़ा भ्रम की स्थिति है: ऐसा इसलिए है क्योंकि row[1:] खाली हो जाएगा और इस प्रकार row[0] हिस्सा का मूल्यांकन कभी नहीं है। मैं की तरह

groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 

result = {} 
for group in groups: 
    for item in group[1:]: 
     result[item] = group[0] 
print result 
+0

काफी बेहतर। अधिकांश समय, 1 लाइन समाधान केवल चतुरता दिखाने के लिए हैं – Jagannath

8

नीचे यह अनिवार्य रूप से विलेम के एक खूबसूरत संस्करण है कोड लिखने होगा:

>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']] 
>>> {k:g for g,*tail in groups for k in tail} 
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'} 

लेकिन यह एक रिक्त सूची से काम नहीं करेगा: groups = [[],['A','B']]

>>> {k:head for head, *tail in grps for k in tail} 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <dictcomp> 
ValueError: not enough values to unpack (expected at least 1, got 0) 
4

मैं भी विल्म के समाधान की तरह, लेकिन केवल पूर्णता के लिए ...

itertool का उपयोग करके एक और भिन्नता और एक जनरेटर समारोह (अजगर 3.x केवल)

def pairs(groups): 
    for value,*keys in groups: 
     for key_value in zip(keys, itertools.repeat(value)): 
      yield key_value 

dict(pairs(groups)) 
{'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'} 
संबंधित मुद्दे