我有一个zip
对象,我想对它进行排序(基于特定的密钥)。
我已经看过How do I sort a zipped list in Python?但已接受的答案在python 3.6中不起作用。
例如
In [6]: a = [3,9,2,24,1,6]
In [7]: b = ['a','b','c','d','e']
In [8]: c = zip(a,b)
In [9]: c
Out[9]: <zip at 0x108f59ac8>
In [11]: type(c)
Out[11]: zip
In [12]: c.sort()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-12-a21727fa8976> in <module>()
----> 1 c.sort()
AttributeError: 'zip' object has no attribute 'sort'
# Wanted this to be sorted by the first element
In [13]: for l,r in c: print(l,r)
3 a
9 b
2 c
24 d
1 e
换句话说,如何使zip迭代顺序符合排序顺序。 我知道将zip转换为元组列表将允许我修复此问题,但我想保留压缩对象(因为它曾经是python2.7的旧时代)
答案 0 :(得分:8)
zip()
返回迭代器;当您从中请求元素时,输入会被压缩。迭代器不可排序,不。
您可以使用sorted()
function来“抽出”&#39;元素并从中返回一个排序列表:
sorted(zip(a, b))
您还可以通过调用zip()
将list()
对象转换为列表,然后使用list.sort()
方法对该结果进行排序,但那样就可以了比使用sorted()
函数更多的工作。
sorted()
使用与list.sort()
相同的关键字参数,因此您仍然可以使用相同的key
函数:
演示:
>>> a = [3, 9, 2, 24, 1, 6]
>>> b = ['a', 'b', 'c', 'd', 'e']
>>> sorted(zip(a, b))
[(1, 'e'), (2, 'c'), (3, 'a'), (9, 'b'), (24, 'd')]
>>> sorted(zip(a, b), key=lambda x: x[1])
[(3, 'a'), (9, 'b'), (2, 'c'), (24, 'd'), (1, 'e')]
另见What is the difference between `sorted(list)` vs `list.sort()` ? python
答案 1 :(得分:3)
您无法在zip对象上使用sort
,zip
对象没有此类属性。但是,您可以将zip
对象转换为包含list(zipped_object)
的列表,然后对其应用sort
,以进行就地排序。
但是,由于压缩对象也是可迭代的,我建议使用sorted()。它还允许您编写一个排序函数,根据该函数对集合进行排序。
在这里,我根据每个y
对中(x,y)
的值对其进行排序。
>>> a = [3,9,2,24,1,6]
>>> b = ['a','b','c','d','e']
>>> c = zip(a,b)
>>>
>>> sorted(c, key = lambda x:x[1])
[(3, 'a'), (9, 'b'), (2, 'c'), (24, 'd'), (1, 'e')]
请注意,sorted
将返回新的排序列表,而sort
将对集合进行排序。