2009-09-07 5 views

Antwort

289

nicht die effizienteste, aber bei weitem die naheliegendste Möglichkeit, es zu tun ist:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a) & set(b) 
{5} 

wenn Auftrag von Bedeutung ist Sie es mit Listenkomprehensionen wie dies tun können:

>>> [i for i, j in zip(a, b) if i == j] 
[5] 

(funktioniert nur für Listen gleicher Größe, die Reihenfolge-Bedeutung impliziert).

+5

Ein Wort der Warnung ist die Liste Verständnis * nicht * unbedingt die schnellere Option. Bei größeren Mengen (bei denen die Leistung wahrscheinlich am wichtigsten ist) wird der bitweise Vergleich ('&') oder 'set (a) .intersection (b)' so schnell oder schneller sein wie das Listenverständnis. – Joshmaker

+5

Noch eine Vorsichtsmaßnahme: Das Listenverständnis findet die Werte, die in beiden an den GLEICHEN Positionen erscheinen (das ist, was SilentGhost mit "Auftrag ist signifikant" meint). Die Set-Schnittpunkt-Lösungen finden auch Übereinstimmungen an VERSCHIEDENEN Positionen. Dies sind Antworten auf 2 ganz unterschiedliche Fragen ... (die Frage des Ops ist mehrdeutig, um welche Frage es sich handelt) – drevicko

+0

Wie machen Sie das, wenn Ihre Listen Listen von Listen sind, dh a = [[0,0], [1, 0]] und b = [[2,3], [0,0]] – Schneems

11

Der einfachste Weg, das zu tun ist sets zu verwenden:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a) & set(b) 
set([5]) 
260

Verwenden set.intersection(), es ist schnell und gut lesbar.

>>> set(a).intersection(b) 
set([5]) 
+22

Diese Antwort weist eine gute algorithmische Leistung auf, da nur eine der Listen (kürzer sollte bevorzugt werden) in einen Satz für eine schnelle Suche umgewandelt wird, und die andere Liste wird durchlaufen, indem ihre Artikel in dem Satz nachgeschlagen werden. – u0b34a0f6ae

+3

'bool (set (a) .intersection (b))' für 'True' oder' False' – Akshay

+0

Diese Antwort ist flexibler und lesbarer, da die Leute möglicherweise ['difference'] benötigen (https: //docs.python. org/3/library/stdtypes.html # frozenset.difference) oder ['union'] (https://docs.python.org/3/library/stdtypes.html#frozenset.union). –

5

Haben Sie Duplikate? Wenn nicht vielleicht sollten Sie Sätze verwenden statt:


>>> set([1, 2, 3, 4, 5]).intersection(set([9, 8, 7, 6, 5])) 
set([5]) 
+0

Wenn Sie wirklich Listen wollen, http://www.java2s.com/Code/Python/List/Functiontointersecttwolists.htm >>> schneiden ([1, 2, 3, 4, 5], [9, 8, 7, 6, 5]) [5] –

+0

Nach dem doc - * ... schließt fehleranfällige Konstruktionen wie Set ('abc') & 'cbs' zugunsten des besser lesbaren Set ('abc') aus. Schnittpunkt ('cbs'). * - http://docs.python.org/library/sets.html –

3

können Sie verwenden

def returnMatches(a,b): 
     return list(set(a) & set(b)) 
9
>>> s = ['a','b','c'] 
>>> f = ['a','b','d','c'] 
>>> ss= set(s) 
>>> fs =set(f) 
>>> print ss.intersection(fs) 
    **set(['a', 'c', 'b'])** 
>>> print ss.union(fs)   
    **set(['a', 'c', 'b', 'd'])** 
>>> print ss.union(fs) - ss.intersection(fs) 
    **set(['d'])** 
+0

Die akzeptierte Antwort funktioniert nicht für Listen, die Zeichenfolgen enthalten. Dieser tut das. – Antony

8

Auch Arbeiten Sie können dies versuchen, indem Sie allgemeine Elemente in einer neuen Liste beibehalten.

new_list = [] 
for element in a: 
    if element in b: 
     new_list.append(element) 
64

Eine schnelle Performance-Test Lutz-Lösung zeigt, ist die beste:

import time 

def speed_test(func): 
    def wrapper(*args, **kwargs): 
     t1 = time.time() 
     for x in xrange(5000): 
      results = func(*args, **kwargs) 
     t2 = time.time() 
     print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0) 
     return results 
    return wrapper 

@speed_test 
def compare_bitwise(x, y): 
    set_x = frozenset(x) 
    set_y = frozenset(y) 
    return set_x & set_y 

@speed_test 
def compare_listcomp(x, y): 
    return [i for i, j in zip(x, y) if i == j] 

@speed_test 
def compare_intersect(x, y): 
    return frozenset(x).intersection(y) 

# Comparing short lists 
a = [1, 2, 3, 4, 5] 
b = [9, 8, 7, 6, 5] 
compare_bitwise(a, b) 
compare_listcomp(a, b) 
compare_intersect(a, b) 

# Comparing longer lists 
import random 
a = random.sample(xrange(100000), 10000) 
b = random.sample(xrange(100000), 10000) 
compare_bitwise(a, b) 
compare_listcomp(a, b) 
compare_intersect(a, b) 

Dies sind die Ergebnisse auf meiner Maschine sind:

# Short list: 
compare_bitwise took 10.145 ms 
compare_listcomp took 11.157 ms 
compare_intersect took 7.461 ms 

# Long list: 
compare_bitwise took 11203.709 ms 
compare_listcomp took 17361.736 ms 
compare_intersect took 6833.768 ms 

Offensichtlich jede künstliche Leistungsprüfung sollte genommen werden ein Körnchen Salz, aber seit der set().intersection() Antwort ist mindestens so schnell als die anderen Lösungen, und auch die meisten Readab le, sollte es die Standardlösung für dieses allgemeine Problem sein.

1

können Sie verwenden:

a = [1, 3, 4, 5, 9, 6, 7, 8] 
b = [1, 7, 0, 9] 
same_values = set(a) & set(b) 
print same_values 

Ausgang:

set([1, 7, 9]) 
+3

wie ist das anders als die akzeptierte antwort von vor 6+ jahren? – tom

+1

Nun, ich schrieb das komplette Detail mit Ausgabe und gut für Anfänger Python –

1

andere ein bisschen mehr funktional Liste Gleichheit für Liste 1 (lst1) und Liste 2 (lst2) zu prüfen, wo Objekte Tiefe haben eine und die hält die Reihenfolge ist:

all(i == j for i, j in zip(lst1, lst2)) 
3

Kann itertools.product auch zu verwenden.

>>> common_elements=[] 
>>> for i in list(itertools.product(a,b)): 
... if i[0] == i[1]: 
...  common_elements.append(i[0]) 
0

Wenn Sie einen Booleschen Wert wollen:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b) 
False 
>>> a = [3,1,2] 
>>> b = [1,2,3] 
>>> set(b) == set(a) & set(b) and set(a) == set(a) & set(b) 
True 
0

Mit __and__ Attribut Methode funktioniert auch.

>>> a = [1, 2, 3, 4, 5] 
>>> b = [9, 8, 7, 6, 5] 
>>> set(a).__and__(set(b)) 
set([5]) 

oder einfach

>>> set([1, 2, 3, 4, 5]).__and__(set([9, 8, 7, 6, 5])) 
set([5]) 
>>>  
1
a = [1, 2, 3, 4, 5] 
b = [9, 8, 7, 6, 5] 

lista =set(a) 
listb =set(b) 
print listb.intersection(lista) 
returnMatches = set(['5']) #output 

print " ".join(str(return) for return in returnMatches) # remove the set() 

5  #final output 
+0

Während dieser Code die Frage beantworten kann, die Bereitstellung zusätzlicher Kontext in Bezug darauf, wie und/oder warum es das Problem löst würde den langfristigen Wert der Antwort verbessern. –

Verwandte Themen