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)].
zipped.sort(key = lambda t: t[1])
Assez facile:
sorted(zipped, key=lambda x: x[1])
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é.
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)]
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)]