[英]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( zip
和itertools.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.