Удалить дубликат списка целых чисел, присутствующих в списке списка, без учета порядка списков целых чисел - PullRequest
0 голосов
/ 22 мая 2018
l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]

В моем случае [1, 2, -1] считается равным [2, 1, -1] и [1, -1, 2].По сути, порядок не имеет значения.

[1, 2, -1] = [2, 1, -1] = [1, -1, 2]

В случаях, подобных описанным выше, мне нужно оставить только 1 из этих 3 (любой из этих трех подойдет).

Таким образом, после удаления дубликатов список теперь должен иметь l1 = [[1, 2, -1], [1, 0, 1]] или l1 = [[2, 1, -1], [1, 0, 1]] или l1 = [[1, -1, 2], [1, 0, 1]]

Я попытался отсортировать отдельные списки (но это приводит к потере порядка вкоторые триплеты были замечены) и помещая каждый отдельный список в словарь (TypeError: unhashable type: 'list')

Примечание:

Когда я говорю «без учета порядка списковцелые числа ", я имею в виду, что если в моем списке 3 списка с одинаковыми целыми числами, упорядоченные по-разному?Эти 3 списка считаются одинаковыми!Вам разрешено удалить 2 из этих 3 списков, но при этом сохранить порядок удаления из списка,

Я привел пример, который показал, что для моего списка список l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]], [[-1, 1, 2], [0, 1, 1]] неприемлем, так как[-1, 1, 2] фактически не присутствует в исходном массиве в такой точной последовательности![-1, 1, 2] = [1, 2, -1] = [2, 1, -1] = [1, -1, 2] ПРАВДА!ЕСЛИ Я В ЭТОМ СПИСКЕ 4 ЭЛЕМЕНТА.Но у меня нет [-1, 1, 2] в моем списке списков!

Также важно:

У меня могут быть повторяющиеся элементы в списке целых чисел.

l1 = [[1, 0, 0], [0, 1, 0], [-1, 0, 1]]

Здесь: [1, 0, 0] = [0, 1, 0], при возврате моего вывода мне нужно будет удалить один из этих двух.

Я хочу подчеркнуть, что в этих отдельных списках есть 2 нулей (я думаю, это тоже важная деталь).

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

Это одно решение с использованием сторонней библиотеки toolz.Примечание compose и unique рецепты ленивы и их легко извлечь из соответствующего исходного кода, если у вас нет доступа к библиотеке.

Обратите внимание, что мыотсортировать каждый подсписок и затем преобразовать в неизменяемый tuple.Это позволяет unique формировать и отслеживать set значений для поиска O (1).

from toolz import unique, compose

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]

res = list(unique(l1, key=compose(tuple, sorted)))

print(res)

[[1, 2, -1], [1, 0, 1]]

Исходный код: toolz.compose, toolz.unique

0 голосов
/ 22 мая 2018

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

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
seen = set()

out = []
for l in l1:
    t = tuple(sorted(l))
    if t in seen:
        continue
    seen.add(t)
    out.append(l)

print(out)
0 голосов
/ 22 мая 2018

Вы можете отсортировать список с помощью sorted, а затем проверить и добавить к результату.

Пример:

l1 = [[1, 2, -1], [1, 0, 1], [2, 1, -1], [1, -1, 2]]
checkVal = []
r = []
for i in l1:
    val = sorted(i)
    if val not in checkVal:
        checkVal.append(val)
        r.append(i)
print(r)

вывод:

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