2015-12-12 4 views
2

Если у меня есть два списка, которые выглядят следующим образом:Python: проверить, если список содержится в другом списке

list1 = ['a', 'a', 'b', 'c'] 
list2 = ['a', 'a', 'a', 'b'] 

Как я могу проверить, если второй список содержится в первом? Я предполагаю, что наборы не будут работать, потому что буквы могут быть повторены.

+1

Попробуйте со счетчиком. – zvone

+0

Имеет ли значение вопрос или просто количество вхождений значений? – eestrada

+0

@eestrada заказ не имеет значения –

ответ

2

Наборы не будет работать, если частота, но независимо от того, подсчета частоты будет:

from collections import Counter 
list1 = ['a', 'a', 'b', 'c'] 
list2 = ['a', 'a', 'a', 'b'] 
cn1, cn2 = Counter(list1), Counter(list2) 
print(all(cn2[k] <= v for k, v in cn1.items())) 

Если количество каждой строки в list2 является < = количеству раз он появляется в list1 у вас есть все строки из list2 в list1, что для списков в вашем вопросе будет возвращать значение False, но для,

list1 = ['a', 'a', 'b', 'c', 'a'] 
list2 = ['a', 'a', 'a', 'b'] 

вернется True, как у вас есть такое же количество элементов а и б.

+0

Если я не ошибаюсь, это вернет True только тогда, когда списки будут идентичными. –

+0

@shomz, я отредактировал, поэтому вы хотите посмотреть, можете ли вы составить первый список, используя элементы во втором? –

0

Подобно @ Padraic_Cunningham Ответим:

from collections import Counter 

def contained(l1, l2): 
    cntr1 = Counter(list1) 
    cntr2 = Counter(list2) 
    for k in cntr2: 
     if cntr2[k] != cntr1.get(k): 
      return False 
    return True 

list1 = ['a', 'a', 'b', 'c'] 
list2 = ['a', 'a', 'a', 'b'] 

contained(list1, list2) 
Смежные вопросы