Удаление дубликатов в списке списков в Python - PullRequest
0 голосов
/ 26 августа 2018

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

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

Поскольку значение 1 существует в начале двух списков - мне нужно удалить оба, чтобы новый список стал:

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

Как я могу это сделать?

Я пробовал ниже, но вывод: [[1, 2], [2, 4], [3, 5]]

def unique_by_first_n(n, coll):
    seen = set()
    for item in coll:
        compare = tuple(item[:n])
        print compare   # Keep only the first `n` elements in the set
        if compare not in seen:
            seen.add(compare)
            yield item

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

filtered_list = list(unique_by_first_n(1, a))

Ответы [ 4 ]

0 голосов
/ 26 августа 2018

Решение 1

a = [[1,2],[1,0],[2,4],[3,5]]
b = []
for item in a:
    i = 0
    if item[0] == a[i][0]:
        i =+ 1
        continue
    else:
        b.append(item)
        i += 1

Решение 2

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

for item in a:
    for i in range(0, len(a)):
        if item[0] == a[i][0]:
            break
        else:
            if item in b:
                continue
            else:
                b.append(item)

Выход

(xenial)vash@localhost:~/pcc/10$ python3 remove_help.py 
[[1, 2], [1, 0], [2, 4], [3, 5]]
[[2, 4], [3, 5]]

Достигнута ваша цель без сложных методов!Наслаждайтесь!

0 голосов
/ 26 августа 2018

Эффективным решением было бы создание объекта Counter для хранения вхождений первых элементов, а затем фильтрация подсписков в основном списке:

from collections import Counter
counts = Counter(l[0] for l in a)
filtered = [l for l in a if counts[l[0]] == 1]
#[[2, 4], [3, 5]]
0 голосов
/ 26 августа 2018

Если вы счастливы использовать стороннюю библиотеку, вы можете использовать Pandas:

import pandas as pd

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

df = pd.DataFrame(a)
b = df.drop_duplicates(subset=[0], keep=False).values.tolist()

print(b)

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

Уловка - это аргумент keep=False, описанный в документации для pd.DataFrame.drop_duplicates.

0 голосов
/ 26 августа 2018

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

from collections import Counter
c = Counter(n for n, _ in a)
b = [[x, y] for x, y in a if c[x] == 1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...