Как проверить, что все элементы 1 списка находятся в * одинаковом количестве * и в любом порядке, в списке 2?
Сначала я знаю, что это очень распространенный вопрос, но я не нашел такого конкретного. (Если да, скажите, пожалуйста.) И все найденные мной способы не сработали. Мне нужно проверить, все ли элементы списка 1 отображаются в списке одинаково.
Пример:
#If list1 = [2,2,2,6]
# and list2 =[2,6,2,5,2,4]
#then all list1 are in list2.
#If list2 = [2,6] then all list1 are not in list2.
я пытаюсь так:
list1 = [6,2]
import itertools
for i in itertools.product((2,4,5,1), repeat=3) :
asd = i[0] + i[1]
asd2= i[1] + i[2]
list2 = [asd, asd2]
if all(elem in list2 for elem in list1):
print (i,list2)
Это работает, когда элементы не повторяются в списке 1, как [1,2]. Но когда они повторяются, все повторяющиеся элементы считаются только 1: [2,2,2] его значение понимается как [2]. Или я так думаю.
Ответы
Ответ 1
Используйте collections.Counter
для преобразования в представление dict_items
Набор пар (значение, количество). Тогда вы можете использовать обычные операции над множествами.
from collections import Counter
def a_all_in_b(a, b):
"""True only if all elements of 'a' are in 'b' in the *same quantity* (in any order)."""
return Counter(a).items() <= Counter(b).items()
Обратите внимание, что Counter
работает только с хешируемыми элементами, поскольку он является подклассом dict
.
Ответ 2
Измените этот ответ на Проверка, является ли список подсписком, чтобы проверить равенство вхождений:
from collections import Counter
list1 = [2,2,2,6]
list2 =[2,6,2,5,2,4]
def same_amount(a,b):
c1 = Counter(a)
c2 = Counter(b)
for key,value in c1.items():
if c2[key] != value:
return False
return True
print(same_amount(list1,list2))
print(same_amount(list1 + [2],list2))
Выход:
True
False
Для создания этого ответа почти не требуется знания о передаче, поэтому я предложил его как обман. Этот вопрос является просто более конкретным случаем того, что проверяется, является ли список подсписком.