簡體   English   中英

python中元組列表的多級排序

[英]Multilevel sorting of list of tuples in python

我正在嘗試對以下列表進行排序:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

基於每個元組的第二個(asc)和第三個元素(asc)導致:

[('b', 1, 2), ('a', 1, 3), ('c', 2, 1)]

我嘗試使用:

sorted(list1, key=lambda x: x[1], x[2])

但導致錯誤:

SyntaxError: positional argument follows keyword argument

方法如下:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

print(sorted(list1, key=lambda x: (x[1], x[2])))

Output:

[('b', 1, 2), ('a', 1, 3), ('c', 2, 1)]

The reason you get the error is because of the comma in. You see, instead of taking it as part of the lambda function, python is interpreting it as you are trying to pass another argument, a positional argument in fact, into the sorted function .

每當調用 function 時,在位置 arguments 之前傳入關鍵字 arguments 將導致您指定的錯誤。

sorted(list1, key=lambda x: x[1], x[2])

注意:切片[1:]也可以:

list1 = [('a', 1, 3), ('b', 1, 2), ('c', 2, 1)]

print(sorted(list1, key=lambda x: x[1:]))

您的密鑰 lambda 中的逗號看起來像是解析器參數的結尾。 將其括起來以消除歧義: key=lambda x: (x[1], x[2])

或者,切片在這種情況下做同樣的事情: key=lambda x: x[-2:]

此外,雖然在這么短的列表上並不重要,但operator.itemgetter function 的性能略優於 lambda - 上次我檢查它在較大列表上的速度大約提高了 10%。 key=operator.itemgetter(1, 2)

根據錯誤消息,解釋器似乎將key=(lambda x:x[1])(x[2])分別解釋為第二個和第三個 arguments 到sorted() 如果將整個 lambda 表達式放在括號中,那么它應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM