tuples

2012-10-31 31 views
5

की दो सूचियों में तत्वों के बीच तत्वों की तुलना करना यहां मैं जो करना चाहता हूं। मेरे पास टुपल्स की दो सूची है। ऐसी है कि List1 में एक टपल में पहला तत्व सूची में एक टपल में पहला तत्व से मेल खाता 2tuples

list1 = [('a', 2), ('b', 3), ('z', 5)] 

list2 = [('a', 1), ('b', 2), ('c', 3)] 

list3 = ['a','b'] 

नोट तत्वों की सूची बिल्ड: कोई डुप्लिकेट पहले तत्वों

हो सकता है अजगर सूची को देखने के बाद comprehensions, यह क्या मैं

[x[0] for x in list1 if (x[0] in [y[0] for y in list2])] 

मेरे सवालों का किया है है कि यह कैसे एक अनुभवी अजगर प्रोग्रामर इस कोड होगा है? इसे स्वयं को कोड करने के बाद भी मुझे इसे पढ़ने के लिए काफी मुश्किल लगता है। यदि नहीं और कैसे आप इसे

+2

चाहिए '[ 'एक', 'बी', 'सी']' और '[ 'एक', 'ग']' मैच ' ' c''? –

+0

मैं कहूंगा कि अंतिम सूची ['ए', 'सी'] होगी, लेकिन मेरे उदाहरण में मैं विशेष रूप से tuples – sidg11

+0

की सूचियों को देख रहा हूं, क्या आप समझा सकते हैं, "टुपल" क्या है? मैं जो शब्द आप पूरा करना चाहता हूं उसके बारे में आप जो शब्द बोलते हैं उसे समझ में नहीं आता ... – Gandaro

उत्तर

8

मैं zip() प्रयोग करेंगे करना होगा:

In [25]: l1 = [('a', 2), ('b', 3), ('z', 5)] 

In [26]: l2 = [('a', 1), ('b', 2), ('c', 3)] 

In [27]: [x[0] for x,y in zip(l1,l2) if x[0]==y[0]] 
Out[27]: ['a', 'b'] 

संपादित करें:

In [36]: [x[0] for x in l1 if any(x[0]==y[0] for y in l2)] 
Out[36]: ['a', 'b'] 
:
अपनी टिप्पणी पढ़ने के ऊपर ऐसा लगता है कि आप कुछ इस तरह की तलाश में हैं की तरह करने के बाद

या का उपयोग कर sets:

In [43]: from operator import itemgetter 

In [44]: set(map(itemgetter(0),l1)) & set(map(itemgetter(0),l2)) 
Out[44]: set(['a', 'b']) 
+0

डांग! मुझे 30 सेकंड तक इसे हराया। नोट: सूची-समझ के बाहर 'ज़िप' द्वारा प्रदर्शन में वृद्धि होगी ताकि 'ज़िप' को हर बार – inspectorG4dget

+0

@ इंस्पेक्टर G4dget पर दोबारा नहीं बदला जा सके, मुझे लगता है कि 'ज़िप()' केवल एक बार बुलाया जाता है, बाइट कोड पर नज़र डालें । –

+1

आप सही हैं। अच्छा निर्णय!'dis' ftw :) – inspectorG4dget

3

मुझे लगता है कि आप set उपयोग करना चाहते हैं यहाँ है:

set(x[0] for x in list1).intersection(y[0] for y in list2) 

या वाक्यात्मक चीनी का उपयोग कर:

{x[0] for x in list1} & {y[0] for y in list2} 

जो दोनों में परिणाम:

set(['a', 'b']) 
2

मुझे लगता है कि यह शायद स्पष्ट है यहां सेट का उपयोग करने के लिए (क्योंकि आपके पास कोई डुप्लिकेट तत्व नहीं हैं):

set1 = set(el[0] for el in list1) 
set2 = set(el[0] for el in list2) 
set3 = set1 & set2 # set intersection 
# list3 = list(set3) 
1

यह मानते हुए कि आप tuples के पहले तत्वों के सेट चौराहे चाहते हैं, आप शब्दकोश प्रमुख दृश्य अजगर 2.7 में पेश उपयोग कर सकते हैं:

dict(list1).viewkeys() & dict(list2).viewkeys() 

इस लंबी सूची के लिए अपने समाधान की तुलना में अधिक कुशल हो जाएगा, चूंकि इसमें रैखिक रनटाइम है (आपके समाधान के लिए ओ (एमएन) के विपरीत), लेकिन परिणाम को मनमाना क्रम में लौटाता है (जैसा कि list1 द्वारा परिभाषित आदेश के विपरीत)।

अजगर 3.x में, यह होगा

dict(list1).keys() & dict(list2).keys() 
संबंधित मुद्दे