как удалить все подмножество из списка списка - PullRequest
0 голосов
/ 02 октября 2018

Какой эффективный способ очистить список в списке.потому что я только хочу получить самый большой набор в списке.просто как.

b = [[1,2,3], [1,2], [3,5], [2,3,4], [2,3,4], [3,4,5], [1,2,4,6,7]]  

, и я хочу вывод, как показано ниже.

result = [[1,2,3], [2,3,4], [3,4,5], [1,2,4,6,7]]

Причина [1,2] является подмножеством [1,2,3] и [1,2,4,6,7], [3,5] является подмножеством [3,4, 5], а также [2,3,4] появляются 2 раза, только хочу вычислить 1 раз в конечном результате.Я хочу на основе логического подмножества для фильтрации данных.

Я только придумываю решение с 2 циклами, чтобы решить эту проблему, но если есть другой эффективный способ решить эту проблему.

то, что я пытался сделать так: (после оптимизации этого еще одного эффекта, добавить разрыв и добавить 1 часть, не рассчитать 2 раза)

b = [[1,2,3], [1,2], [3,5], [2,3,4], [2,3,4], [3,4,5], [1,2,4,6,7]]
i = 0
record = []
subset_status = False
for index, re in enumerate(b):
    while i <= (len(b)-1):
        if i != index:
            if i not in record:
                if set(re).issubset(b[i]):
                    subset_status = True
                    break
        i += 1
    i = 0
    if subset_status:
        record.append(index)
        subset_status = False
print(record)
>>[1, 2, 3]

Таким образом, я получил индекс в [1,2,3] грязных данных.Спасибо.

Ответы [ 5 ]

0 голосов
/ 03 октября 2018

Один из способов сделать это - обработать списки в b в порядке длины, от самой длинной до самой короткой.

b = [[1,2,3], [1,2], [3,5], [2,3,4], [2,3,4], [3,4,5], [1,2,4,6,7]]
result = []
for u in sorted(map(set, b), key=len, reverse=True):
    if not any(u <= v for v in result):
        result.append(u)
print(result)

output

[{1, 2, 4, 6, 7}, {1, 2, 3}, {2, 3, 4}, {3, 4, 5}]

Если вам нужно сохранить внутренние списки как фактические списки, а также сохранить порядок, то мы можем сделать это с помощью дополнительной передачи данных.Но вместо использования списка для result я буду использовать набор, чтобы сделать тесты более эффективными.А это означает превращение подсписков в frozensets: простые наборы не будут работать, потому что в набор могут быть помещены только хешируемые объекты.

b = [[1,2,3], [1,2], [3,5], [2,3,4], [2,3,4], [3,4,5], [1,2,4,6,7]]
temp = set()
for u in sorted(map(frozenset, b), key=len, reverse=True):
    if not any(u <= v for v in temp): 
        temp.add(u)
newb = []
for u in b: 
    if set(u) in temp and u not in newb:
        newb.append(u)
print(newb)

output

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2, 4, 6, 7]]
0 голосов
/ 03 октября 2018

Вы можете использовать кортежи и product , чтобы определить, является ли элемент подсписком, а затем создать новый список, исключая эти подсписки

понимание списка

from itertools import product

b = [[1,2,3], [1,2], [3,5], [2,3,4], [3,4,5], [1,2,4,6,7]]

dirty = [i for i in b for j in b if i != j if tuple(i) in product(j, repeat = len(i))]
clean = [i for i in b if i not in dirty]

Расширенное объяснение:

dirty = []
for i in b:
    for j in b:
        if i != j:
            if tuple(i) in product(j, repeat = len(i)):
                dirty.append(i)

clean = [i for i in b if i not in dirty]
[[1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2, 4, 6, 7]]
0 голосов
/ 02 октября 2018

filter Ваш список при условии:

b = [[1,2,3], [1,2], [3,5], [2,3,4],[3,4,5]]

print(list(filter(lambda x: len(x) == 3, b)))
# [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
0 голосов
/ 02 октября 2018

Это не очень хорошо, но работает:

result = []
for i in b:
    for j in result:
        if all(c in j for c in i):
            break
    else:
        new_list.append(i)

for i in result:
    for j in result:
        if all(c in j for c in i) and result.index(i) != result.index(j):
            del(result[result.index(i)])
            break
0 голосов
/ 02 октября 2018

Условное понимание списка - это питонный, гибкий и эффективный подход.Как правило, сборка чистого списка с нуля происходит быстрее и с меньшими ошибками, чем повторное удаление элементов:

b = [[1, 2, 3], [1, 2], [3, 5], [2, 3, 4],[3, 4, 5]]

cleaned = [x for x in b if clean(x)]  # where clean is your condition
# e.g.
cleaned = [x for x in b if len(x) == 3] 
# [[1, 2, 3], [2, 3, 4], [3, 4, 5]]

Если вам нужно изменить исходный объект list, используйте назначение срезов:

b[:] = [x for x in b if clean(x)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...