2017-01-29 14 views
3

У меня есть список из списков слов, называемых словником следующим образом:Найти общие элементы в списке списков

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

Я хочу, чтобы найти общие элементы во всех подсписках. Таким образом, мой желаемый результат приведенного выше списка должны быть:

['cat', 'sheep'] 

Для того, чтобы достичь этого, я создал наборы, используя следующий код:

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

Набор выглядеть следующим образом:

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

В списке может быть любое количество слов, и может быть любое количество списков. Поэтому я могу получить неравномерные наборы любого числа. Я знаю, что я могу сравнить два набора, используя методы пересечения, но как я могу сравнивать несколько наборов, чтобы возвращать только общие элементы?

ответ

10

Вы используете set неправильно. Вы можете использовать его как:

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) 

Это может быть записано в одной строке, как:

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

Трюм значение по common_items будет:

{'sheep', 'cat'} 

Вот решение дает тот же результатом является незначительный эффективный подход к эффективному использованию:

#        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 

С set.intersection принимает все итерации, нет необходимости вводить все установленные под-списки.

0

Самый простой способ заключается в использовании map() для преобразования входов в наборы, а затем использовать set.intersection, чтобы найти их общностей:

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

попробовать этот способ, чтобы получить общие элементы:

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)