web-dev-qa-db-ja.com

Pythonで圧縮リストを並べ替える方法を教えてください。

圧縮リストを並べ替えるPythonの方法は何ですか?

コード:

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

print zipped

上記のコードは[( 'd'、3)、( 'a'、2)、( 't'、1)、( 'x'、0)]を出力します

zip形式を値で並べ替えます。したがって、理想的には次のようになります[( 'x'、0)、( 't'、1)、( 'a'、2)、( 'd'、3)]

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

非常にシンプル:

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

もう少し速くしたい場合は、ig = operator.itemgetter(1)を実行し、igをキー関数として使用します。

8
utdemir

可能な場合は、そもそも順番にZip圧縮する方が簡単で効率的です。あなたの例を考えると、それはかなり簡単です:

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

あなたの場合、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')]
_

しかし、並べ替える必要がある場合は、Python2(sortedおよび_itertools.Zip_)およびPython3で機能するため、Zip(@utdemirまたは@Ulrich Dangelによって提供される)を使用する必要があります。 (Zip)そしてAttributeErrorのような.sort(...)Zipが返されるため、Python2 Zipでのみ機能します)で失敗しませんa 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'
_

しかし、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)]
_
3
MSeifert