Удаление дубликатов из списка списков в Python

Может ли кто-нибудь предложить хорошее решение для удаления дубликатов из вложенных списков, если вы хотите оценить дубликаты на основе первого элемента каждого вложенного списка?

Основной список выглядит так:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]]

Если есть другой список с тем же элементом в первой позиции [k][0], который уже имел место, я бы хотел удалить этот список и получить следующий результат:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33]]

Можете ли вы предложить алгоритм достижения этой цели?


person Community    schedule 17.07.2009    source источник


Ответы (5)


Вы заботитесь о сохранении порядка / какой дубликат будет удален? Если нет, то:

dict((x[0], x) for x in L).values()

сделаю это. Если вы хотите сохранить порядок и хотите сохранить первый найденный, тогда:

def unique_items(L):
    found = set()
    for item in L:
        if item[0] not in found:
            yield item
            found.add(item[0])

print list(unique_items(L))
person Community    schedule 17.07.2009
comment
ваше преобразование в диктовку было настолько элегантнее, чем ум, что я украл его :) - person Jiaaro; 17.07.2009
comment
Разве первый не сохраняет порядок, потому что dicts сохраняет порядок, начиная с Python 3.7, и ключи вставляются в том порядке, в котором их производит понимание? - person xuiqzy; 01.10.2020

вместо этого используйте dict:

L = {'14': ['65', 76], '2': ['5', 6], '7': ['12', 33]}
L['14'] = ['22', 46]

если вы получаете первый список из внешнего источника, преобразуйте его так:

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46]]
L_dict = dict((x[0], x[1:]) for x in L)
person Community    schedule 17.07.2009

Используйте панды:

import pandas as pd

L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']]

df = pd.DataFrame(L)
df = df.drop_duplicates()

L_no_duplicates = df.values.tolist()

Если вы хотите удалить дубликаты только в определенных столбцах, используйте вместо этого:

df = df.drop_duplicates([1,2])
person Community    schedule 17.03.2016

я не уверен, что вы имели в виду под "другим списком", поэтому я предполагаю, что вы говорите эти списки внутри L

a=[]
L = [['14', '65', 76], ['2', '5', 6], ['7', '12', 33], ['14', '22', 46],['7','a','b']]
for item in L:
    if not item[0] in a:
        a.append(item[0])
        print item
person Community    schedule 17.07.2009
comment
Это было бы более эффективно, если бы вы использовали набор для 'a' - вы O (N ^ 2), используя такой список, и амортизируете O (N), используя набор. - person RichieHindle; 17.07.2009
comment
что не пришло в голову, спасибо за информацию. тем не менее, этот код работает в более старой версии Python, которая не поставляется с набором. ;) - person ghostdog74; 17.07.2009

Если порядок не имеет значения, код ниже

print [ [k] + v for (k, v) in dict( [ [a[0], a[1:]] for a in reversed(L) ] ).items() ]

дает

[['2', '5', '6'], ['14', '65', '76'], ['7', '12', '33']]

person Community    schedule 17.07.2009