Как получить уникальное значение комбинации из списка в Python - PullRequest
1 голос
/ 07 мая 2019

У меня есть список списков, таких как

items = [[1, 2], [2, 3], [2, 1], [1, 2]]

Нужно извлечь только уникальную комбинацию из набора, без повторов. Например, [1,2] и [2,1] одинаковы. В этом случае мы должны рассмотреть только один набор.

Ожидаемый результат: [[1,2],[2,3]]

Как этого добиться с помощью python?

Ответы [ 6 ]

6 голосов
/ 07 мая 2019
items = [[1, 2], [2, 3], [2, 1], [1, 2]]
result = {tuple(sorted(c)) for c in items}
print(result)  # {(1, 2), (2, 3)}

Остерегайтесь того, как это влияет на порядок как комбинаций в результате, так и чисел в комбинациях.

2 голосов
/ 07 мая 2019

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

set(frozenset(i) for i in items)

Или если не гарантируется, что каждый элемент в списках уникален в этом списке,

set(tuple(sorted(i)) for i in items)
1 голос
/ 07 мая 2019

Вы можете использовать набор FroZensets для поиска:

items = [[1, 2], [2, 3], [2, 1], [1, 2]]

result = []
lookup = set()

for subl in items:
    fs = frozenset(subl)
    if fs not in lookup:
        result.append(subl)
        lookup.add(fs)

print(result)
# [[1, 2], [2, 3]]
1 голос
/ 07 мая 2019

Вы можете заморозить все внутренние списки до frozenset s и создать набор из внешнего списка.

def deep_frozenset(container):
    """Freeze all lists into frozensets."""

    if isinstance(container, list):
        return frozenset(deep_frozenset(el) for el in container)
    else:
        return container

result = deep_frozenset(items)
assert result == frozenset({frozenset({2, 3}), frozenset({1, 2})})

Вы даже можете написать deep_thawset, чтобы отменить операцию.

def deep_thawset(container):
    """Thaw all frozensets back into lists."""

    is isinstance(container, frozenset):
        return [deep_thawset(el) for el in container]
    else:
        return container

Вы можете даже написать Roundtripper.

def roundtrip(container):
    """Find all unique combinations.

    >>> roundtrip([[1, 2], [2, 3], [2, 1], [1, 2]])
    [[1, 2], [2, 3]]
    """

    deep_thawset(deep_frozenset(container))
0 голосов
/ 07 мая 2019

Вы, вероятно, хотите иметь набор frozensets:

items = set(frozenset(item) for item in [[1, 2], [2, 3], [2, 1], [1, 2]])
items
{frozenset({1, 2}), frozenset({2, 3})}

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

Наконец, дляточно достигните желаемого результата, создайте списки из ваших наборов:

list(list(item) for item in items)
[[1, 2], [2, 3]]
0 голосов
/ 07 мая 2019
items = [[1, 2], [2, 3], [2, 1], [1, 2]]
r=[list(i) for i in list({tuple(sorted(c)) for c in items})]
print(r) # [[1, 2], [2, 3]]

или

items = [[1, 2], [2, 3], [2, 1], [1, 2]]    
u = [list(x) for x in set(tuple(x) for x in list( sorted(c) for c in items))]    
print(u) # [[1, 2], [2, 3]]

или

items = [[1, 2], [2, 3], [2, 1], [1, 2]]
d = list(list(x) for x in { (v,k) if k>=v else (k,v) for k, v in items  })
print(d) # [[1, 2], [2, 3]]
...