在python 3中对压缩对象进行排序

时间:2017-04-29 17:26:01

标签: python sorting

我有一个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的旧时代)

2 个答案:

答案 0 :(得分:8)

Python 3中的

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对象上使用sortzip对象没有此类属性。但是,您可以将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将对集合进行排序。