2010-06-01 6 views
6

में एन-कई सूचियों का चौराहे लेना पाइथन में एन-कई सूचियों के चौराहे को लेने का सबसे आसान तरीका क्या है?पायथन

अगर मैं दो सूचियों ए और बी है, मैं जानता हूँ कि मैं कर सकते हैं:

a = set(a) 
b = set(b) 
intersect = a.intersection(b) 

लेकिन मैं की तरह एक & ख & ग & घ & कुछ करने के लिए ... सूचियों में से एक मनमाना सेट के लिए चाहते हैं (आदर्श रूप से पहले सेट में कनवर्ट किए बिना, लेकिन यदि यह सबसे आसान/सबसे प्रभावी तरीका है, तो मैं उससे निपट सकता हूं।)

आईई मैं एक फ़ंक्शन intersect (* args) लिखना चाहता हूं जो इसे मनमाने ढंग से कई सेटों के लिए कुशलता से करेगा। ऐसा करने का सबसे आसान तरीका क्या है?

संपादित करें: मेरा स्वयं का समाधान कम हो गया है (set.intersection, [ए, बी, सी]) - क्या यह अच्छा है?

धन्यवाद।

+0

पर 'को कम()', यह नहीं है वास्तव में सबसे अच्छा विचार है, क्योंकि यह अजगर 3. में चरणबद्ध तरीके से समाप्त किया जा रहा है यह भी मैं क्या सुना है से धीमी,, पाश के लिए एक की तुलना में है। –

+0

डुप्लिकेट: http://stackoverflow.com/questions/2893500/take-the-intersection-of-an-arbitrary-number-of-lists-in-python –

+0

@Xavier: 'functools आयात से कम करें'। इसे 'बिल्टिन्स' से हटा दिया गया है, यह पूरी तरह से चरणबद्ध नहीं है। इसके अलावा, आपने अपनी गति के बारे में जो कुछ सुना है वह बेहद गलत है: यह लूप के मुकाबले बहुत तेज़ या धीमा हो सकता है। – tzot

उत्तर

13

यह 1 या अधिक सूचियों के लिए काम करता है। 0 सूचियों का मामला इतना आसान नहीं है, क्योंकि इसे एक ऐसे सेट को वापस करना होगा जिसमें सभी संभावित मान हों।

def intersection(first, *others): 
    return set(first).intersection(*others) 
+0

सुंदर। वास्तव में सरल –

+0

और इस प्रकार बिल्ट-इन्स का उपयोग करने की सुंदरता। – jathanism

2

यह 1 या अधिक सूचियों के साथ काम करता है और एक से अधिक पैरामीटर का उपयोग नहीं करता:

>>> def intersection(*listas): 
...  return set(listas[0]).intersection(*listas[1:]) 
...  
>>> intersection([1,2,3,4],[4,5,6],[2,4,5],[1,4,8]) 
set([4]) 
>>> intersection([1,2,3,4]) 
set([1, 2, 3, 4]) 
>>> 
नहीं

यकीन है कि यह वैसे भी अन्य उत्तर की तुलना में बेहतर है।

2
lists = [[5,4,3], [4,2], [6,2,3,4]] 

try: 
    # the following line makes one intersection too much, but I don't think 
    # this hurts performance noticably. 
    intersected = set(lists[0]).intersection(*lists) 
except ValueError: 
    # no lists[0] 
    intersected = set() 

print intersected   # set([4]) 

सेट किसी भी पुनरावर्तनीय के साथ छेड़छाड़ की जा सकती है, इसे पहले सेट में बदलने की आवश्यकता नहीं है।