[英]Python sum of second and third element of tuple in list of tuples grouped by first
[英]Sorting a list of tuples by the addition of second and third element of the tuple
我有一個元組列表,它是:
[('g', 10, 2), ('o', 6, 11), ('v', 2, 4), ('t', 1, 15), ('x', 40, 3), ('m', 4, 4), ('k', 10, 2), ('f', 14, 1), ('p', 70, 90), ('l', 21, 7), ('n', 1, 27), ('a', 39, 70), ('d', 11, 10), ('h', 21, 10), ('c', 10, 19), ('b', 8, 1), ('e', 30, 39), ('i', 23, 29), ('r', 8, 7), ('q', 2, 2), ('s', 18, 86)]
我正在努力解決如何對它們進行排序,以便它們可以像這樣放置:
[('p', 70, 90), ('a', 39, 70), ('s', 18, 84), ('è', 27, 45), ('e', 30, 39), ('i', 23, 29), ('x', 40, 3), ('h', 21, 10), ('c', 10, 19), ('l', 20, 7), ('d', 11, 10), ('o', 6, 11), ('t', 1, 15), ('f', 14, 1), ('r', 8, 7), ('g', 10, 2), ('k', 10, 2), ('n', 1, 11), ('b', 8, 1), ('m', 4, 4), ('v', 2, 4), ('q', 2, 2)]
它應該是元組的第二個和第三個元素的添加,當它們是相同的ex時。 (a,10,9)
和(b,9,10)
它們應按字母順序排序。 它是用python 3.5編寫的,我無法調用任何庫
您可以將元組設置為對列表進行排序的鍵:
sorted(lst, key = lambda x: (sum(x[1:]), x[0]))
通過這種方式,它將首先按元組的最后兩個元素的總和,然后按元組的第一個元素進行排序。
如果你喜歡降序的結果,正如@Moses評論的那樣,你可以將reverse
參數指定為True
:
sorted(lst, key = lambda x: (sum(x[1:]), x[0]), reverse = True)
更新 :要以不同的方式處理降序,升序,因為此處的sum
是數字,您也可以否定sum
。 通過這種方式,它會為降序排列sum
,但對於字母的第一個字母。
sorted(lst, key = lambda x: (-sum(x[1:]), x[0]))
sorted(a, key=lambda x: (sum(x[1:3]), x[0]))
其中a
是你的清單。 如果你需要逆轉:
sorted(a, key=lambda x: (sum(x[1:3]), x[0]), reverse=True)
a = [('g', 10, 2), ('o', 6, 11), ('v', 2, 4), ('t', 1, 15),
('x', 40, 3), ('m', 4, 4), ('k', 10, 2), ('f', 14, 1),
('p', 70, 90), ('l', 21, 7), ('n', 1, 27), ('a', 39, 70),
('d', 11, 10), ('h', 21, 10), ('c', 10, 19), ('b', 8, 1),
('e', 30, 39), ('i', 23, 29), ('r', 8, 7), ('q', 2, 2),
('s', 18, 86)]
創建一個函數,它將返回項目的總和,並使用該函數作為排序鍵。 我喜歡在從iterables中提取項目時使用operator.itemgetter()。
import operator
second_third_first_items = operator.itemgetter(1, 2, 0)
def key(thing):
*two_three, one = second_third_first_items(thing)
return (sum(two_three), one)
a.sort(key = key, reverse = True)
沒有operator.itemgetter的key
def key(thing):
one, *two_three = thing[:3]
return (sum(two_three), one)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.