Comment puis-je supprimer succinctement les doublons d'une list
d'objets personnalisés à l'aide d'une fonction d'égalité personnalisée?
De nombreuses solutions repose sur set()
ou le haut- in
l' opérateur, mais je ne peux pas garantir que les objets ont défini __eq__
ou __hash__
.
Une solution peut-elle être écrite plus succinctement en utilisant des listes de compréhension ou d'autres astuces astucieuses que ma tentative initiale?
l = [4, 9, 5, 1, 3, 1, 8, 9, 5, 4] result = [] for n,i in enumerate(l): found=False for j in l[:n]: if (lambda a, b: a == b)(i,j): // or use a custom function found=True break if not found: result.append(i) print(l) print(result)
3 Réponses :
[v1 for i, v1 in enumerate(l) if not any(v1 == v2 for v2 in l[:i])]
Comment any()
prendre v1 == v2 for v2 in l[:i]
comme argument? Si vous v1 == v2 for v2 in l[:i]
autonome, vous obtenez une erreur de syntaxe. Quel est le mécanisme (fonction de langue) utilisé ici?
@Shuzheng Si vous avez une compréhension du générateur comme seul argument d'une fonction, vous êtes autorisé à omettre les parenthèses extérieures. Si vous trouvez cela déroutant, utilisez la première version, qui les inclut explicitement.
Je vois que j'ai besoin de parenthèses autour de v1 == v2 for v2 in l[:i]
: (v1 == v2 for v2 in l[:i])
, pourquoi est-ce nécessaire? Et pourquoi peut-il être laissé de côté dans un appel de fonction?
@Shuzheng Je suppose que c'est juste une sténographie autorisée car il n'y a rien avec lequel elle pourrait être confondue.
l = [4, 9, 5, 1, 3, 1, 8, 9, 5, 4] result = [] for n,i in enumerate(l): if i not in result: result.append(i) else: continue print(l) print(result)
Vous n'avez pas besoin du cas spécial n == 0
.
Je vais modifier ceci pour supprimer le cas spécial - j'espère que cela vous convient. Lorsque n == 0
(la première itération), le result
est une liste vide et que i not in result
évaluera de toute façon True
.
Hy, il n'est pas nécessaire d'utiliser enumerate:
l = [4, 9, 5, 1, 3, 1, 8, 9, 5, 4] result = [] for i in l: if i not in result: result.append(i) else: continue print(result)
stackoverflow.com/questions/30310542/...
"Je ne peux pas garantir que les objets ont défini
__eq__
ou__hash__
." - Ils auront les deux par défaut à moins qu'ils ne les définissent explicitement surNone
. (Ou s'ils définissent explicitement__eq__
sans définir__hash__
, leur__hash__
sera implicitementNone
.)