簡體   English   中英

如何在 Python 中對壓縮列表進行排序?

[英]How do I sort a zipped list in Python?

對壓縮列表進行排序的 Pythonic 方式是什么?

代碼 :

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

print zipped

上面的代碼打印[('d', 3), ('a', 2), ('t', 1), ('x', 0)]

我想作為排序依據的值壓縮 所以理想情況下,它最終看起來像這樣[('x', 0), ('t', 1), ('a', 2), ('d', 3)]

非常簡單:

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

如果您希望它更快一點,請執行ig = operator.itemgetter(1)並使用ig作為關鍵函數。

在您的情況下,您根本不需要排序,因為您只需要一個枚舉的倒序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( zipitertools.zip )和 Python3 ( zip )上運行,並且不會因AttributeError而失敗.sort(...) (僅適用於 Python2 zip因為zip返回一個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)]

首先(如果可以)按順序壓縮它們更簡單,更有效。 鑒於您的示例,這很容易:

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

在分類器中對特征重要性進行排序 (dtc=decision_tree):

for name, importance in sorted(zip(X_train.columns, 
                dtc.feature_importances_),key=lambda x: x[1]):
    print(name, importance)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM