2013-04-12 7 views
5

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

d = {'a': [1, 2, 3], 'b': [5, 6, 7], 'c': [9, 0]} 

my_list = [] 
for k, v in d.items(): 
    for x in v: 
     my_list.append(x) 

मैं इसे कैसे कर सकता है?

+0

प्रश्न से संबंधित नहीं है, लेकिन ध्यान दें कि 'list' और' dict' वास्तव में बुरा चर नाम हैं, क्योंकि वे दोनों कर रहे हैं '[]' और '{}' क्रमशः इनबिल्ट कन्स्ट्रक्टर। – Yuushi

+0

@ युसुशी ओह हाँ, मैं भी इसका उल्लेख कर रहा था लेकिन भूल गया। मैं उन्हें संपादित कर दूंगा – jamylak

+0

आप सही हैं, thx दोस्तों। – bandit

उत्तर

9
>>> d = {'a': [1, 2, 3], 'b': [5, 6, 7], 'c': [9, 0]} 
>>> [y for x in d.values() for y in x] 
[1, 2, 3, 9, 0, 5, 6, 7] 

यह एक नेस्टेड list comprehension है। यह दिखाने के लिए कि यह कैसे काम करता है, आप इसकी संरचना को देखने के लिए लाइनों में इसे तोड़ सकते हैं जैसे नेस्टेड for लूप। यह बाएं से दाएं चला जाता है।

[y 
for x in d.values() 
for y in x] 
+1

सेक्सीनेस के लिए सॉर्ट करें! :) –

+0

मैं कैसे समझ सकता हूं कि इस तरह लूप के लिए डबल का उपयोग कैसे करें? मुझे यह नहीं पता कि xD – bandit

+0

@bandit मैंने यह दिखाने के लिए जवाब संपादित किया कि यह कैसे काम करता है। अगर आपको – jamylak

1
list(itertools.chain(*d.values())) 

रूप @jamylak सुझाव दिया है, तो निम्न, और अधिक कुशल हो के रूप में यह बचा जाता है पूर्ण unpacking * ऑपरेटर द्वारा किया जा सकता है:

list(itertools.chain.from_iterable(d.values())) 

अजगर 2.x में, .itervalues का उपयोग सूचियों की अनावश्यक प्रतिलिपि से बचने के लिए .values के बजाय।

+1

का मतलब है 'chain.from_iterable' – jamylak

+0

@jamylak, हाँ मेरा जवाब काफी काम नहीं किया। मैंने इसे '*' – shx2

+0

जोड़कर तय किया है, यह व्यावहारिक रूप से समतुल्य है, सिवाय इसके कि आपको पहले सभी मानों को अनपैक करना होगा, 'chain.from_iterable' अधिक कुशल – jamylak

0

का उपयोग ऑपरेटर ओवरलोडिंग -

sum(d.values(), []) 
+0

सावधानी: इसमें 'ओ (एन^2)' रनटाइम है। Py3k में भी काम नहीं करता है – jamylak

1

कैसे के बारे में

ll = [] 
for l in d.values(): 
    ll.extend(u) 
संबंधित मुद्दे