Уникальный список списков - PullRequest
1 голос
/ 08 октября 2019

В качестве примера у меня есть вложенный список:

lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]]

Я пытаюсь проверить, совпадают ли первые 3 индекса элемента вложенного списка с другими.

Т.е.

, если [1,2,3] существует в других списках, удалите все остальные элементы вложенного списка, которые его содержат. Так что вложенный список уникален.

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

for i in range(0, len(lst_a)):
    if lst[i][:3] == lst[i-1][:3]:
         lst[i].pop()

Желаемый вывод:

lst_a = [[1,2,3,9], [1,2,6,8]]

Ответы [ 4 ]

1 голос
/ 08 октября 2019

Если, как вы сказали в комментариях, подсписки, которые имеют одинаковые первые три элемента, всегда находятся рядом друг с другом (но список не обязательно отсортирован), вы можете использовать itertools.groupby для группировки этих элементов и затем получить next из каждой группы.

>>> from itertools import groupby
>>> lst_a = [[1,2,3,5], [1,2,3,7], [1,2,3,9], [1,2,6,8]]
>>> [next(g) for k, g in groupby(lst_a, key=lambda x: x[:3])]
[[1, 2, 3, 5], [1, 2, 6, 8]]

Или используйте представление списка с enumerate и сравните текущий элемент с последним:

>>> [x for i, x in enumerate(lst_a) if i == 0 or lst_a[i-1][:3] != x[:3]]
[[1, 2, 3, 5], [1, 2, 6, 8]]

Это не требует импорта, но имхо при использовании groupby гораздо понятнее, что должен делать код. Однако обратите внимание, что, в отличие от вашего метода, оба из них создадут новый отфильтрованный список вместо обновления / удаления из исходного списка.

0 голосов
/ 08 октября 2019

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

dct = {tuple(i[:3]): i for i in lst}
# {(1, 2, 3): [1, 2, 3, 9], (1, 2, 6): [1, 2, 6, 8]}

list(dct.values())
# [[1, 2, 3, 9], [1, 2, 6, 8]]
0 голосов
/ 08 октября 2019

Следуя вашему подходу, найдите следующий код:

lst=[lst_a[0]]
for li in lst_a[1:]:
    if li[:3]!=lst[0][:3]:
        lst.append(li)
print(lst)

Надеюсь, это поможет!

0 голосов
/ 08 октября 2019

Я думаю, что вам не хватает цикла For, если вы хотите проверить все возможности. Я думаю, это должно выглядеть так:

for i in range(0, len(lst_a)):
   for j in range(i, len(lst_a)):
      if lst[i][:3] == lst[j][:3]:
         lst[i].pop()

Удаление при просмотре списка, возможно, не лучшая идея, вам следует удалить ненужные элементы в конце

...