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

2024-09-30 04:30:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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的好日子一样)


Tags: 对象答案in排序顺序zipoutsort
2条回答

不能对zip对象使用sortzip对象没有这样的属性。但是,您可以将zip对象转换为具有list(zipped_object)的列表,然后对其应用sort进行就地排序。

但是,由于压缩对象也是一个iterable,我的建议是使用sorted()。它还允许您编写一个排序函数,根据该函数对集合进行排序。

在这里,我根据每个(x,y)对中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将对集合进行就地排序。

Python 3中的zip()返回一个迭代器;当您请求元素时,输入将被压缩。迭代器不可排序,不

您可以使用^{} function来“抽出”元素并从中返回排序列表:

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

相关问题 更多 >

    热门问题