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.
4 Réponses :
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]
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?
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']
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']
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']]
vous avez besoin de
e = [list (set (x) for x in e]