115 votes

Comment faire des listes distinctes?

J'ai une liste en Python, comment puis-je rendre ses valeurs uniques?

Merci.

239voto

Mark Byers Points 318575

Le plus simple consiste à convertir en ensemble puis en liste:

 my_list = list(set(my_list))
 

Un inconvénient avec ceci est qu'il ne préservera pas l'ordre. Vous voudrez peut-être aussi déterminer si un ensemble serait une meilleure structure de données à utiliser en premier lieu, au lieu d'une liste.

26voto

Paweł Prażak Points 1054

Des versions modifiées de http://www.peterbe.com/plog/uniqifiers-benchmark

Pour conserver l'ordre:

def f(seq): # Order preserving
  ''' Modified version of Dave Kirby solution '''
  seen = set()
  return [x for x in seq if x not in seen and not seen.add(x)]

OK, maintenant, comment ça fonctionne, parce que c'est un peu difficile ici if x not in seen and not seen.add(x):

In [1]: 0 not in [1,2,3] and not print('add')
add
Out[1]: True

Pourquoi ne revient-elle Vraie? imprimer (et réglez-le.ajouter) ne retourne rien:

In [3]: type(seen.add(10))
Out[3]: <type 'NoneType'>

et not None == True, mais:

In [2]: 1 not in [1,2,3] and not print('add')
Out[2]: False

Pourquoi faut-il imprimer 'ajouter' dans [1], mais pas dans [2]? Voir False and print('add'), et ne vérifie pas le deuxième argument, parce qu'il connaît déjà la réponse, et renvoie true si les deux arguments sont Vrais.

Plus générique, plus lisible, générateur de fonction, ajoute la capacité de transformer les valeurs d'une fonction:

def f(seq, idfun=None): # Order preserving
  return list(_f(seq, idfun))

def _f(seq, idfun=None):  
  ''' Originally proposed by Andrew Dalke '''
  seen = set()
  if idfun is None:
    for x in seq:
      if x not in seen:
        seen.add(x)
        yield x
  else:
    for x in seq:
      x = idfun(x)
      if x not in seen:
        seen.add(x)
        yield x

Sans ordonnance (c'est plus rapide):

def f(seq): # Not order preserving
  return list(set(seq))

20voto

brillout.com Points 2289

one-liner et préserver l'ordre

 list(OrderedDict.fromkeys([2,1,1,3]))
 

bien que vous aurez besoin

 from collections import OrderedDict
 

11voto

khachik Points 12589

Pour préserver l'ordre:

 l = [1, 1, 2, 2, 3]
result = list()
map(lambda x: not x in result and result.append(x), l)
result
# [1, 2, 3]
 

4voto

cod3monk3y Points 1109

Que diriez-vous de la compréhension du dictionnaire ?

 {x:1 for x in mylist}.keys()
 

(juste parce que je ne savais pas qu'ils existaient jusqu'à il y a une minute)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X