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

У меня был список:

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

Я хочу получить:

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

[2,3,4] дублируется, а [2,3], [1,5] полностью содержится в [2,3,4], [1,5,4], поэтому я хочу удалить его

Я использую set(frozenset(x) for x in a) для удаления дубликатов, но я застрял в том, как удалить [2,3], [1,5], которые содержатся в другом подсписке в

1 Ответ

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

Вы можете преобразовать подсписки в a в наборы и отсортировать их по длине в обратном порядке, чтобы вы могли перебирать их и добавлять каждый набор к выходным данным, только если он не является подмножеством какого-либо изсуществующие наборы в выходных данных:

output = []
for candidate in sorted(map(set, a), key=len, reverse=True):
    if not any(candidate <= incumbent for incumbent in output):
        output.append(candidate)

list(map(list, output)) возвращает:

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

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

output = []
for candidate in sorted(map(dict.fromkeys, a), key=len, reverse=True):
    if not any(candidate.keys() <= incumbent.keys() for incumbent in output):
        output.append(candidate)

, так что list(map(list, output)) возвращает:

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

Если вы используете Python 3.6 или более ранние версии, где порядок ключей dict не гарантирован, вы можете использовать collections.OrderedDict вместо dict.

...