1
votes

Remplacer les doublons dans une colonne de liste

J'ai une liste, dans une (la dernière) colonne se trouve une chaîne d'éléments séparés par des virgules:

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

Maintenant, je veux supprimer les doublons dans cette colonne.

J'ai essayé de faire une liste de chaque colonne:

TypeError: unhashable type: 'list'

Ce qui m'a donné:

    y = list(set(e))
    print y

Maintenant, j'ai essayé pour supprimer les doublons avec:

[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF', 'FFF', 'EE']]

Ce qui a abouti à une erreur

    e = [s.split(',') for s in temp]
    print e

J'apprécierais toute aide.

Modifier :

Je n'ai pas dit exactement quel devrait être le résultat final. La liste devrait ressembler à ça

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']

Seuls les doublons devraient être supprimés dans la dernière colonne.


1 commentaires

vous avez besoin de e = [list (set (x) for x in e]


4 Réponses :


3
votes

Appliquer set sur les éléments de la liste non sur la liste des listes. Vous voulez que votre set contienne les chaînes de chaque liste, pas les listes.

['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

Vous pouvez également le faire directement:

e = sorted({x for s in temp for x in s.split(',')})

vous voudrez peut-être triés (set (s.split (','))) à la place pour garantir l'ordre lexicographique (les ensembles ne sont pas ordonnés, même en python 3.7 )

pour une liste plate et ordonnée, créer une compréhension d'ensemble à plat et la trier:

e = [list(set(s.split(','))) for s in temp]

>>> e
[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]

résultat:

e = [list(set(x)) for x in e]


1 commentaires

En fait, vous n'avez pas du tout besoin de listes dans une liste. Existe-t-il un moyen d'appliquer l'ensemble et de supprimer les doublons sans liste dans la liste?



0
votes

Voici la solution, qui utilise itertools.chain méthode

import itertools

temp = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
y = list(set(itertools.chain(*[s.split(',') for s in temp])))
# ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']


0 commentaires

0
votes
 a = ['AAA', 'BBB', 'CCC-DDD', 'EE,FFF,FFF,EE']
 b = [s.split(',') for s in a]
 c = []
 for i in b:
     c = c + i
 c = list(set(c))

 ['EE', 'FFF', 'AAA', 'BBB', 'CCC-DDD']

0 commentaires

0
votes

Voici un moyen purement fonctionnel de le faire en Python:

from itertools import chain

list(chain(*map(set, (map(split, temp)))))
['AAA', 'BBB', 'CCC-DDD', 'EE', 'FFF']

Ou comme je vois la réponse n'a pas besoin de listes à l'intérieur d'une liste:

from functools import partial

split = partial(str.split, sep=',')

list(map(list, map(set, (map(split, temp)))))
[['AAA'], ['BBB'], ['CCC-DDD'], ['EE', 'FFF']]


0 commentaires