найти набор (имеющий копии элементов) - это подмножество большего набора в python - PullRequest
0 голосов
/ 12 февраля 2020

у меня есть 2 набора a = [3,4,5,5] b = [3,4,5,6,7,8,9], мы должны выяснить, является ли a подмножеством b?

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
if(set(a).issubset(set(b))): 
    print('yes')
else:
    print('no')

этот код печатает да, поскольку он игнорирует копии элементов, пример: он считает, что 5 встречается только один раз в наборе 'a'

Я хочу, чтобы ответ был 'нет' как б имеет только один 5.

Ответы [ 3 ]

1 голос
/ 12 февраля 2020

Если вы должны сделать это без библиотек и ваши списки отсортированы, вы можете выполнить сопоставление с помощью итератора. Переходите ко второму набору, одновременно продвигая первый, когда значения совпадают. Вы будете знать, что первый список является подмножеством второго, если вы пройдете через все это (используя итератор)

def isSubset(setA,setB):
    iterA  = iter(setA)
    valueA = next(iterA,None)
    for valueB in setB:
        if valueA == valueB:
            valueA = next(iterA,None)
    return valueA is None

a=[3,4,5,5] 
b=[3,4,5,6,7,8,9]
print(isSubset(a,b)) # False

c=[3,4,5,5,5,6,7,8,9]
print(isSubset(a,c)) # True  

d=[3,4,5,5,5,6,7]
print(isSubset(b,d)) # False  

, если списки не гарантированы для сортировки, вы можете отсортировать их в начале функции, добавив:

setA,setB = sorted(setA),sorted(setB)

, если вы хотите сделать это быстрее, вы можете добавить условие для выхода из l oop, как только достигнут конец setA или когда значение в наборе B больше текущего значения набора A:

# at beginning of for loop:
if valueA is None or valueB > valueA: break
0 голосов
/ 12 февраля 2020

Используйте collections.Counter.

all(v >= 0 for v in (Counter(b) - Counter(a)).values())

Это верно, если a является дополнительной сумкой b.

0 голосов
/ 12 февраля 2020

5 происходит дважды в a, но один раз в наборе (a). set(a)=(3,4,5) и set(b)=(3,4,5,6,7,8,9), поэтому ответ правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...