Ответ 1
zipped.sort(key = lambda t: t[1])
Что такое Pythonic для сортировки zip-списка?
код:
names = list('datx')
vals = reversed(list(xrange(len(names))))
zipped = zip(names, vals)
print zipped
Вышеприведенный код печатает [('d', 3), ('a', 2), ('t', 1), ('x', 0)]
Я хочу сортировать zipped по значениям. В идеале это выглядит так: [('x', 0), ('t', 1), ('a', 2), ('d', 3)].
zipped.sort(key = lambda t: t[1])
Довольно просто:
sorted(zipped, key=lambda x: x[1])
import operator
sorted(zipped, key=operator.itemgetter(1))
Если вы хотите немного быстрее, сделайте ig = operator.itemgetter(1)
и используйте ig
как ключевую функцию.
Это проще и эффективнее застегивать их по порядку в первую очередь (если можно). Учитывая ваш пример, это довольно легко:
>>> names = 'datx'
>>> zip(reversed(names), xrange(len(names)))
<<< [('x', 0), ('t', 1), ('a', 2), ('d', 3)]
В вашем случае вам не нужно сортировать вообще, потому что вы просто хотите перечислить перевернутый список вашего 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')]
Но если вам нужно отсортировать его, вы должны использовать sorted
(как предоставлено @utdemir или @Ulrich Dangel), потому что он будет работать на Python2 (zip
и itertools.zip
) и Python3 (zip
) и не будет терпеть неудачу с AttributeError
как .sort(...)
(который работает только на Python2 zip
, потому что там zip
возвращает list
):
>>> # Fails with Python 3 zip:
>>> zipped = zip(names, vals)
>>> zipped.sort(lambda x: x[1])
AttributeError: 'zip' object has no attribute 'sort'
>>> # Fails with Python 2 itertools izip:
>>> from itertools import izip
>>> zipped = izip(names, vals)
>>> zipped.sort(lambda x: x[1])
AttributeError: 'itertools.izip' object has no attribute 'sort'
Но sorted
работает в каждом случае:
>>> 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)]