Как проверить, является ли вложенный список подмножеством другого вложенного списка - PullRequest
0 голосов
/ 21 марта 2019

У меня есть 2 списка в виде list<list<list>> списков, где я хочу проверить, является ли один из них подмножеством другого.

list_1 = [
           [
             [1,2],[2,3]
           ],
           [
             [3,4],[5,6]
           ]
         ]
list_2 = [
           [
             [3,4], [5, 6]
           ]
         ]

Таким образом, ожидаемый результат такой, как в list2 есть [[[3,4]]], который является частью list_1, поэтому он должен быть подмножеством.

list_1 имеет 2 элемента, а его второй элемент соответствует первому элементу в list_2, поэтому list_2 является подмножеством list_1.

Сравнение не на уровне элемента, а на уровне списка.

Я пробовал set(list_2) < set(list_1), но в результате unhashable type: list.Как я могу добиться приведенного выше сравнения тогда?

Ответы [ 3 ]

3 голосов
/ 21 марта 2019

Вы можете перебрать list_2 и проверить, содержатся ли его элементы в list_1:

list_1 = [[[1, 2], [2, 3]], [[3, 4], [5, 6]]]
list_2 = [[[3, 4], [5, 6]]]

all(x in list_1 for x in list_2)  # Option 1.
all(map(list_1.__contains__, list_2))  # Option 2.

Вторая версия работает для списков (и других типов), но a in b является более общим, посколькуон возвращается к b.__iter__, если b.__contains__ не определено.

0 голосов
/ 21 марта 2019

У вас есть вложенные списки, поэтому простое сравнение не сработает.Вот функция, которая проверяет, является ли l2 подмножеством l1:

list_1 = [[[1,2],[2,3],[3,4]]]
list_2 = [[[2,3],[3,4]]]

def comparison_nested_lists(l1,l2):
    l1,l2 = l1[0],l2[0]
    l2_in_l1 = True
    for i in l2:
        if i not in l1:
            l2_in_l1 = False
    return l2_in_l1

print comparison_nested_lists(list_1,list_2)  
0 голосов
/ 21 марта 2019

Наборы не могут содержать списки, потому что наборы полагаются на то, что их элементы неизменны, а списки изменяемы.Если вы переключите списки на кортежи, это будет работать:

list_1 = [(1,2), (2,3), (3,4)]
list_2 = [(2,3), (3,4)]
set(list_2) < set(list_1)

Вы также можете изменить внешние списки на кортежи, но я оставил их как списки, чтобы было понятно, какие из них должны быть кортежами.

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