簡體   English   中英

根據Python中元組中第一個字段的總和對元組列表列表進行排序

[英]Sorting a list of list of tuples based on the sum of first field in the tuple in Python

我有一個最外面的列表,其中包含這種格式的每月不同項目的總數。 每個月都有相同的項目。

big_list = [
  [
    (20, 'Item A', 'Jan'),
    (30, 'Item B', 'Jan'),
    (12, 'Item C', 'Jan'),
  ],
  [
    (22, 'Item A', 'Feb'),
    (34, 'Item B', 'Feb'),
    (15, 'Item C', 'Feb'),
  ],

  .... # until 'Dec'
]

我想根據一年中的項目總數對該列表進行排序。 (全年中特定項目的元組中第一個字段的總和) 例如,如果Item C在兩個月中的計數最高,其次是Item AItem B ,則最終結果將是

[
  [
    (12, 'Item C', 'Jan'),
    (20, 'Item A', 'Jan'),
    (30, 'Item B', 'Jan'),
  ],
  [
    (15, 'Item C', 'Feb'),
    (22, 'Item A', 'Feb'),
    (34, 'Item B', 'Feb'),
  ],

  ... # until 'Dec'
]
# Item C = 12 + 15 = 27
# Item A = 20 + 22 = 42
# Item B = 30 + 34 = 64

我該如何實現? 任何幫助或啟示將不勝感激。

big_list = [
  [
    (20, 'Item A', 'Jan'),
    (30, 'Item B', 'Jan'),
    (12, 'Item C', 'Jan'),
  ],
  [
    (22, 'Item A', 'Feb'),
    (34, 'Item B', 'Feb'),
    (15, 'Item C', 'Feb'),
  ]]

s = {}
for l in big_list:
    for m in l:
        s[m[1]] = s.get(m[1], 0) + m[0]

給我們s我們要用於排序的總和: {'Item A': 42, 'Item B': 64, 'Item C': 27}

最后:

for l in big_list:
    l.sort(key=lambda x: s[x[1]])

big_list更改為:

[[(12, 'Item C', 'Jan'), (20, 'Item A', 'Jan'), (30, 'Item B', 'Jan')],
 [(15, 'Item C', 'Feb'), (22, 'Item A', 'Feb'), (34, 'Item B', 'Feb')]]

此解決方案適用於以任何順序在幾個月內出現的列表,並且如果某個項目在某個月沒有出現也可以使用。

如果您確實需要兩個襯板:

for small_list in big_list:
  small_list.sort(key=lambda x: -sum([y[0] for l in big_list for y in l  if y[1] == x[1]]))

編輯:甚至單線

[sorted(small_list, key=lambda x: -sum([y[0] for l in big_list for y in l  if y[1] == x[1]])) for small_list in big_list]

@Pankrat很接近:

for inner in big_list:
    inner.sort()

您內部有一個列表列表,因此,簡單的list.sort()不能list.sort() 您必須進入內部級別列表才能對其進行排序(該列表包含元組)。

幸運的是,您的案例僅要求您對元組中的第一個元素進行排序; 如果您必須對其他商品進行排序,那么您將需要其他商品,例如:

for inner in big_list:
    inner.sort(key = lambda x: x[i]) # i is the index location you want to sort on

我建議的解決方案:

[sublist.sort() for sublist in biglist]

之后,對大名單進行排序。 您不必分配列表理解!

暫無
暫無

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

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