我有一个元组列表,看起来像这样:
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
我想按元组内整数值的升序对此列表进行排序。这种排序方式可行吗?
我有一个元组列表,看起来像这样:
[('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
我想按元组内整数值的升序对此列表进行排序。这种排序方式可行吗?
尝试使用sorted()
的key
关键字参数,默认情况下按升序排序:
sorted(
[('abc', 121), ('abc', 231), ('abc', 148), ('abc', 221)],
key=lambda x: x[1]
)
key
应该是一个函数,用于确定如何从数据结构中检索可比较的元素。在您的情况下,它是元组的第二个元素,因此我们访问 [1]
。
为了优化,请参见 jamylak 的响应,使用 operator.itemgetter(1)
,这实际上是 lambda x: x[1]
的更快版本。
sorted(some_list, lambda x: (x[0], -x[1],))
。 - Seraf>>> from operator import itemgetter
>>> data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
>>> sorted(data,key=itemgetter(1))
[('abc', 121), ('abc', 148), ('abc', 221), ('abc', 231)]
在我看来,使用itemgetter
在这种情况下比@cheeken的解决方案更易读。它也更快,因为几乎所有的计算都将在c
端完成,而不是通过使用lambda
。
>python -m timeit -s "from operator import itemgetter; data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=itemgetter(1))"
1000000 loops, best of 3: 1.22 usec per loop
>python -m timeit -s "data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]" "sorted(data,key=lambda x: x[1])"
1000000 loops, best of 3: 1.4 usec per loop
itemgetter()
是更好的解决方案。但是,我认为一个lambda表达式会更清楚地说明key
函数的作用。 - cheekentime \
python -c "the code"`` 然后我得到了你所说的“肉眼”结果,以及更快的系统时钟时间。我仍然不确定这是为什么,但它是可以重现的。我猜这与加载模块的开销有关,但对我来说还不太清楚。 - Jeff Sheffieldpython -m timeit -s
内部执行导入,但是我认为你说的在生产场景中只需支付一次库加载惩罚是正确的。至于谁关心那微秒...你会关心,因为假设你的排序数据将变得非常大,那么一旦数据集增长,那微秒就会变成真正的秒数。 - Jeff Sheffield在Cheeken的回答基础上,这是如何按第二项降序排列元组列表的方法。
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)],key=lambda x: x[1], reverse=True)
sorted
函数只是为您生成一个已排序的新列表。 - ZhaoGangAs a python neophyte, I just wanted to mention that if the data did actually look like this:
data = [('abc', 121),('abc', 231),('abc', 148), ('abc',221)]
然后 sorted()
会自动按元组中的第二个元素排序,因为第一个元素都相同。
使用原地排序,可以使用
foo = [(list of tuples)]
foo.sort(key=lambda x:x[0]) #To sort by first element of the tuple
来自Python维基百科:
>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
def MyFn(a):
return a[1]
那么:
sorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=MyFn)
lambda x: x[1]
。 - Tom Myddeltynsorted([('abc', 121),('abc', 231),('abc', 148), ('abc',221)], key=lambda (k, val): val)
OP中排序值为整数与问题本身无关。换句话说,如果排序值是文本,则接受的答案也适用。我提到这一点还是为了指出在排序过程中可以修改排序方式(例如,考虑大小写)。
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: x[1])
[(148, 'ABC'), (221, 'DEF'), (121, 'abc'), (231, 'def')]
>>> sorted([(121, 'abc'), (231, 'def'), (148, 'ABC'), (221, 'DEF')], key=lambda x: str.lower(x[1]))
[(121, 'abc'), (148, 'ABC'), (231, 'def'), (221, 'DEF')]