2017-01-29 9 views
3

Ich habe eine Liste von Listen von Wörtern genannt Wortliste wie folgt:finden gemeinsame Elemente in der Liste der Listen

[['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'], ['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']] 

ich die gemeinsamen Elemente in allen Teillisten finden möchten. Daher sollte meine gewünschte Ausgabe der obigen Liste sein:

['cat', 'sheep'] 

Um dies zu erreichen, habe ich Sätze den folgenden Code verwendet:

sets = set(tuple(row) for row in wordlist) 

Das Set sieht wie folgt aus:

{('cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new'), ('dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time')} 

Es kann eine beliebige Anzahl von Wörtern pro Liste geben, und es kann eine beliebige Anzahl von Listen geben. So kann ich mit ungeraden Mengen einer beliebigen Nummer enden. Ich weiß, dass ich zwei Sets mit den Schnittmethoden vergleichen kann, aber wie kann ich über mehrere Sets hinweg vergleichen, um nur die üblichen Items zurückzugeben?

Antwort

10

Sie verwenden set nicht korrekt. Sie können es gerne verwenden:

my_list = [['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'], ['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']] 

# convert list of list to list of sets 
my_sets = map(set, my_list) 

# perform intersection on each set present in list 
common_items = set.intersection(*my_sets) 

Dieses in einer Zeile geschrieben werden als:

common_items = set.intersection(*map(set, my_list)) 

Der Wert halten durch common_items sein:

{'sheep', 'cat'} 

Hier ist die Lösung geben gleiche Ergebnis mit der leicht Leistung effizienter Ansatz:

#        v no need to type-cast sub-lists to `set` here 
set(my_list[0]).intersection(*my_list[1:]) 

# OR, 
# set(my_list[0]).intersection(*my_list) 
# as intersection of set with itself returns the same set 

Da set.intersection alle Iterables akzeptiert, müssen nicht alle zu setzenden Unterlisten typisiert werden.

0

Der einfachste Weg ist map() zu verwenden, um die Eingänge zu Sätzen zu konvertieren, und dann set.intersection nutzen, um ihre Gemeinsamkeiten zu finden:

>>> data = [['dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time'], 
      ['cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new']] 
>>> set.intersection(*map(set, data)) 
{'sheep', 'cat'} 
0

versuchen auf diese Weise, um gemeinsame Elemente zu erhalten:

wordlist ={('cow', 'pig', 'bomb', 'cat', 'sheep', 'cake', 'boy', 'new'), ('dog', 'cat', 'sheep', 'rabbit', 'kiss', 'time')}</i> 
for word in wordlist: 
    for cm in word: 
     if(cm in cm): 
      print(cm) 
Verwandte Themen