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

У меня есть 2d список

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

Как мне получить результат:

result = [[1,2],[1,3],[2,3]]

Где дубликаты удаляются независимо от их порядка внутренних списков.

Ответы [ 4 ]

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

Понятие «сет» здесь пригодится. У вас есть список (который содержит дубликаты), который можно преобразовать в набор (который никогда не будет содержать дубликат). Узнайте больше о наборах здесь: Набор

Пример:

l = ['foo', 'foo', 'bar', 'hello']

Набор может быть создан напрямую:

s = set(l)

теперь, если вы проверяете содержимое списка

print(s)
>>> {'foo', 'bar', 'hello'}

Set будет работать таким образом с любым повторяемым объектом! Надеюсь, это поможет!

0 голосов
/ 29 октября 2018
In [3]: b = []
In [4]: for aa in a:
...:     if not any([set(aa) == set(bb) for bb in b if len(aa) == len(bb)]):
...:         b.append(aa)
In [5]: b
Out[5]: [[1, 2], [1, 3], [2, 3]]
0 голосов
/ 29 октября 2018

Хотя мне нравится идея @ RoadRunner's FrozenSet (наборы полезны, и они позволяют вам находить уникальные элементы, не изобретая велосипед / не пытаясь быть умнее людей, которые разработали Python), вы также можете попробовать что-то вроде этого, где Вы просто пытаетесь удалить обратный подсписок для каждого элемента. Недостатком является то, что это может быть слишком дорого, если у вас есть куча не дубликатов:

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

result = a.copy()
for x in result:
  try:
    result.remove([x[-1::-1])
  except:
    pass

>>> [[1, 2], [1, 3], [2, 3]]

Это должно работать с подсписками произвольного размера.

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

Попробуйте использовать набор, чтобы отслеживать, какие списки вы видели:

from collections import Counter

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

seen = set()
result = []
for lst in a:
    current = frozenset(Counter(lst).items())
    if current not in seen:
        result.append(lst)
        seen.add(current)

print(result)

Какие выходы:

[[1, 2], [1, 3], [2, 3], [1, 2, 1]]

Примечание: Поскольку списки не могут хешироваться, вы можете хранить замороженные объекты из Counter объектов, чтобы обнаруживать порядок меньше дубликатов. Это устраняет необходимость сортировки вообще.

...