基于Python中元组中第一个字段的总和对元组列表进行排序

时间:2011-12-22 14:21:15

标签: python list sorting tuples

我有一个最外面的列表,其中包含此格式的不同项目的每月总计数。每个月都有相同的项目。

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 CItem 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

我怎样才能做到这一点?任何帮助或启发将不胜感激。

4 个答案:

答案 0 :(得分:3)

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')]]

此解决方案适用于任何订单中的月份内的列表,以及某些项目在某个月内未出现的情况。

答案 1 :(得分:1)

如果你真的需要两个班轮:

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]

答案 2 :(得分:0)

@Pankrat很接近:

for inner in big_list:
    inner.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

答案 3 :(得分:0)

我建议的解决方案:

[sublist.sort() for sublist in biglist]

之后大名单被排序。你不必分配列表理解!