Как проверить, что все элементы 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

Для создания этого ответа почти не требуется знания о передаче, поэтому я предложил его как обман. Этот вопрос является просто более конкретным случаем того, что проверяется, является ли список подсписком.