2010-05-19 16 views
45
def common_elements(list1, list2): 
    """ 
    Return a list containing the elements which are in both list1 and list2 

    >>> common_elements([1,2,3,4,5,6], [3,5,7,9]) 
    [3, 5] 
    >>> common_elements(['this','this','n','that'],['this','not','that','that']) 
    ['this', 'that'] 
    """ 
    for element in list1: 
     if element in list2: 
      return list(element) 

अब तक यह पता चला है, लेकिन यह काम करने के लिए प्रतीत नहीं होता! धन्यवाद2 सूचियों के बीच सामान्य तत्व तुलना

उत्तर

97
>>> list1 = [1,2,3,4,5,6] 
>>> list2 = [3, 5, 7, 9] 
>>> list(set(list1).intersection(list2)) 
[3, 5] 
+0

+1 लेकिन व्यक्तिगत रूप से मैं frozenset इस्तेमाल किया के रूप में यह अपरिवर्तनीय है और इतने शब्दकोश कुंजी आदि – zebrabox

+6

इस के रूप में इस्तेमाल किया जा सकता/अद्वितीय/आम तत्वों वापस आ जाएगी, लेकिन कोई दोहराया तत्वों कि मौजूद हो सकता था। – Dologan

+0

@SilentGost। दो सूची से मिलान किए गए तत्वों की संख्या कैसे प्राप्त करें। इस मामले में यह 2 है। – Poka

17

उपयोग सेट चौराहों, सेट (List1) & सेट (List2)

>>> def common_elements(list1, list2): 
...  return list(set(list1) & set(list2)) 
... 
>>> 
>>> common_elements([1,2,3,4,5,6], [3,5,7,9]) 
[3, 5] 
>>> 
>>> common_elements(['this','this','n','that'],['this','not','that','that']) 
['this', 'that'] 
>>> 
>>> 

ध्यान दें कि सूची परिणाम मूल सूची के साथ अलग आदेश हो सकता है।

+0

मदद के लिए धन्यवाद। समझें कि मैं कहां गलत हुआ और अगली बार क्या काम करना है। :) – Daniel

+0

महान है, डैनियल :-) – YOU

+1

महान समाधान। क्या इसके साथ आदेश को संरक्षित करने का एक तरीका भी है? – tarrasch

22

S.Mark और SilentGhost द्वारा सुझाए गए समाधान आम तौर पर आपको बताते हैं कि इसे पाइथोनिक तरीके से कैसे किया जाना चाहिए, लेकिन मैंने सोचा कि आपको यह जानने से भी लाभ हो सकता है कि आपका समाधान क्यों काम नहीं करता है। समस्या यह है कि जैसे ही आप दो सूचियों में पहला सामान्य तत्व पाते हैं, आप केवल उस तत्व को वापस कर देते हैं।

def common_elements(list1, list2): 
    result = [] 
    for element in list1: 
     if element in list2: 
      result.append(element) 
    return result 

इससे भी छोटा संस्करण का उपयोग कर सूची comprehensions:: आपका समाधान एक result सूची बनाने और उस सूची में आम तत्वों को इकट्ठा करके ठीक किया जा सकता

def common_elements(list1, list2): 
    return [element for element in list1 if element in list2] 

हालांकि, जैसा कि मैंने कहा, यह एक है ऐसा करने का बहुत अक्षम तरीका - पायथन के अंतर्निर्मित सेट प्रकार अधिक प्रभावी होते हैं क्योंकि उन्हें आंतरिक रूप से सी में लागू किया जाता है।

+0

दोनों प्रस्तावों के लिए बढ़िया – dlewin

+0

नोट: उपरोक्त विधियां केवल बराबर आकार की सूचियों के लिए काम करेंगी। यदि आप असमान आकार की सूचियों के साथ काम कर रहे हैं, जैसा कि मैं हूं, तो आपको फ़ंक्शन को कॉल करने से पहले लेन() के आधार पर ऑर्डर का मूल्यांकन करना होगा: list1 = [2,2,2], list2 [2,3] - > [2,2,2] सूची 1 = [2,3], सूची 2 [2,2,2] -> [2] – redthumb

8

पिछले सभी अद्वितीय अद्वितीय तत्वों को खोजने के लिए सभी कामों का उत्तर देते हैं, लेकिन सूचियों में बार-बार वस्तुओं के लिए खाते में विफल हो जाएंगे।

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)] 

or True हिस्सा केवल आवश्यक है जब आप करने के लिए किसी भी तत्व को उम्मीद: आप आम तत्व एक ही नंबर में प्रदर्शित करना चाहते हैं के रूप में वे सूची पर आम में पाए जाते हैं, तो आपको निम्न एक लाइनर का उपयोग कर सकते False का मूल्यांकन करें।

+0

विस्मयकारी समाधान, सबसे अच्छा लगता है, अगर थोड़ा terse – Hendeca

+0

यह जवाब होना चाहिए चुना जाना चाहिए था! मुझे लगता है कि यह असमान सूचियों के लिए भी काम करता है। इसके अलावा अधिकांश समाधान 'सेट' का उपयोग करते हैं जो स्थिर नहीं है (उर्फ ऑर्डर खो गया है)। – lifebalance

1

1) Method1 बचत List1 शब्दकोश है और फिर बार-बार दोहराना List2 में प्रत्येक ELEM

def findarrayhash(a,b): h1={k:1 for k in a} for val in b: if val in h1: print("common found",val) del h1[val] else: print("different found",val) for key in h1.iterkeys(): print ("different found",key) आम और विभिन्न तत्वों ढूँढना:

2) Method2 सेट का उपयोग

def findarrayset(a,b): common = set(a)&set(b) diff=set(a)^set(b) print list(common) print list(diff)

0

यहाँ एक बदमाश बल विधि जो मैं आया था। यह निश्चित रूप से सबसे कुशल नहीं है लेकिन यह कुछ है।

मुझे यहां कुछ समाधानों के साथ मिली समस्या यह है कि या तो यह दोहराए गए तत्व नहीं देता है या जब इनपुट ऑर्डर महत्वपूर्ण होता है तो यह तत्वों की सही संख्या नहीं देता है।

#finds common elements 
def common(list1, list2): 
    result = [] 
    intersect = list(set(list1).intersection(list2)) 

    #using the intersection, find the min 
    count1 = 0 
    count2 = 0 
    for i in intersect: 
     for j in list1: 
      if i == j: 
       count1 += 1 
     for k in list2: 
      if i == k: 
       count2 += 1 
     minCount = min(count2,count1) 
     count1 = 0 
     count2 = 0 

     #append common factor that many times 
     for j in range(minCount): 
      result.append(i) 

    return result 
16

तुम भी सेट का उपयोग करें और एक लाइन में समानताएं प्राप्त कर सकते हैं: सेट में से कोई मतभेद युक्त सेट घटाना।

A = [1,2,3,4] 
B = [2,4,7,8] 
commonalities = set(A) - (set(A) - set(B)) 
संबंधित मुद्दे