Как удалить все дубликаты списков и списков, которые являются подмножеством других списков из массива списков? - PullRequest
1 голос
/ 08 января 2020

Мне дан список списков. Я должен удалить из этого списка списков списки, которые являются полными подмножествами любого другого списка в этом списке списков, и списки, которые равны любому другому списку в этом списке списков.

Например, если мой список задан как

A = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 4], [1, 4, 5, 6, 7, 8]]

Вывод должен быть

[[1, 2, 3, 4, 5], [1, 4, 5, 6, 7, 8]]

Мой код выглядит следующим образом:

w=len(A)
sol=[]
for i in range (0,w-1):
    for j in range (1,w):
        ret=all(elem in A[i] for elem in A[j])
        if ret:
            if not(A[i] in sol):
                sol.append(A[i])
        else:
            ret=all(elem in A[j] for elem in A[i])
            if ret:
                if not(A[j] in sol):
                    sol.append(A[j])

Я получаю вывод как

[[1, 2, 3, 4, 5], [1, 4], [1, 4, 5, 6, 7, 8]]

Где я делаю ошибку?

Если есть какой-либо другой способ для этой задачи, вы можете поделиться им.

Ответы [ 2 ]

1 голос
/ 08 января 2020

В ret=all(elem in A[i] for elem in A[j]) вы сравниваете A [i] = [1,4] и A [j] = [1, 4], затем ret возвращает True.

Таким образом, изменение диапазона j будет работать .

# for j in range (1,w): # before

for j in range (i+1,w): # after
    ...

Отредактировано

A = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 4], [1, 4, 5, 6, 7, 8], [1, 2, 3, 6]]
w = len(A)
sol = []

# check wheter A[i] is subset of A[j] or not
for i in range(0, w):
    for j in range(i+1, w):
        ret = all(elem in A[j] for elem in A[i])  # note order: j, i
        if ret:  # A[i] is subset of A[j]
            break

    else:  # A[i] is not subset for all A[j]
        sol.append(A[i])
0 голосов
/ 08 января 2020

Если элементы в каждом подсписке уникальны, вы можете использовать sets

A = [[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 4], [1, 4, 5, 6, 7, 8]]

B = [ set(l) for l in A]

result = []
for candidate in B:
    if any([candidate.issubset(s) for s in B if s != candidate]):
        # Skip subset of any other sublist
        continue
    elif list(candidate) in result:
        # Skip sublists that are already in the result
        continue
    else:
        result.append(list(candidate))
print(result)

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