web-dev-qa-db-fra.com

Comment trier une liste compressée en Python?

Quelle est la façon Pythonique de trier une liste zippée?

code:

names = list('datx')
vals  = reversed(list(xrange(len(names))))
zipped = Zip(names, vals)

print zipped

Le code ci-dessus imprime [('d', 3), ('a', 2), ('t', 1), ('x', 0)]

Je veux trier zippé par les valeurs. Donc, idéalement, cela finirait par ressembler à ceci [('x', 0), ('t', 1), ('a', 2), ('d', 3)].

32
rectangletangle
zipped.sort(key = lambda t: t[1])
29
Owen

Assez facile:

sorted(zipped, key=lambda x: x[1])
45
Ulrich Dangel
import operator
sorted(zipped, key=operator.itemgetter(1))

Si vous le voulez un peu plus rapide, faites ig = operator.itemgetter(1) et utilisez ig comme fonction clé.

8
utdemir

Il est plus simple et plus efficace de les compresser dans l'ordre en premier lieu (si vous le pouvez). Étant donné votre exemple, c'est assez simple:

>>> names = 'datx'
>>> Zip(reversed(names), xrange(len(names)))
<<< [('x', 0), ('t', 1), ('a', 2), ('d', 3)]
4
zeekay

Dans votre cas, vous n'avez pas besoin de trier du tout parce que vous voulez juste une liste inversée énumérée de votre names:

>>> list(enumerate(names[::-1]))      # reverse by slicing
[(0, 'x'), (1, 't'), (2, 'a'), (3, 'd')]

>>> list(enumerate(reversed(names)))  # but reversed is also possible
[(0, 'x'), (1, 't'), (2, 'a'), (3, 'd')]

Mais si vous avez besoin de le trier, vous devez utiliser sorted (tel que fourni par @utdemir ou @Ulrich Dangel) car il fonctionnera sur Python2 (Zip et itertools.Zip) Et Python3 (Zip) et n'échouera pas avec un AttributeError comme .sort(...) (qui ne fonctionne que sur Python2 Zip car il y a Zip renvoie un list):

>>> # Fails with Python 3's Zip:
>>> zipped = Zip(names, vals)
>>> zipped.sort(lambda x: x[1])
AttributeError: 'Zip' object has no attribute 'sort'

>>> # Fails with Python 2's itertools izip:
>>> from itertools import izip
>>> zipped = izip(names, vals)
>>> zipped.sort(lambda x: x[1])
AttributeError: 'itertools.izip' object has no attribute 'sort'

Mais sorted fonctionne dans chaque cas:

>>> zipped = izip(names, vals)
>>> sorted(zipped, key=lambda x: x[1])
[('x', 0), ('t', 1), ('a', 2), ('d', 3)]

>>> zipped = Zip(names, vals)  # python 3
>>> sorted(zipped, key=lambda x: x[1])
[('x', 0), ('t', 1), ('a', 2), ('d', 3)]
3
MSeifert