2009-07-17 9 views
10

Quelqu'un peut-il suggérer une bonne solution pour supprimer les doublons des listes imbriquées si vous voulez évaluer les doublons en fonction du premier élément de chaque liste imbriquée?Supprimer des doublons de la liste des listes en Python

La liste principale ressemble à ceci:

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

Si une autre liste avec le même élément à première position [k][0] qui avait déjà eu lieu, je voudrais supprimer cette liste et d'obtenir ce résultat:

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

Pouvez-vous suggérer un algorithme pour atteindre cet objectif?

Répondre

28

Vous souciez-vous de la préservation de la commande/qui le doublon est supprimé? Si non, alors:

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

le fera. Si vous voulez préserver l'ordre, et que vous voulez garder le premier vous trouvez alors:

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)) 
+0

votre conversion à un dict était tellement plus élégant que l'esprit que je l'ai volé :) – Jiaaro

+0

* que MINE (Je souhaite vraiment pouvoir modifier un commentaire) – Jiaaro

0

Je ne suis pas sûr de ce que vous vouliez dire par « une autre liste », donc je suppose que vous dites ces listes à l'intérieur de 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 
+0

Ce serait plus efficace si vous avez utilisé un ensemble pour « a » - vous êtes O (N^2) en utilisant une liste comme ça, et amortis O (N) en utilisant un ensemble. – RichieHindle

+0

qui n'est pas venu à l'esprit, merci pour l'info. Néanmoins, ce code fonctionne dans une ancienne version de Python qui ne vient pas avec set. ;) – ghostdog74

3

utiliser un dict au lieu comme ceci:

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

si vous reçoivent la première liste d'une source externe, la convertissent comme suit:

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

Si l'ordre n'a pas d'importance, le code ci-dessous

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

donne

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

0

Utilisez les pandas:

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() 

Si vous souhaitez supprimer les doublons dans les colonnes spécifiques au lieu d'utiliser uniquement:

df = df.drop_duplicates([1,2]) 
Questions connexes