在Python中根据元组第一个字段的和对元组列表排序

0 投票
4 回答
1014 浏览
提问于 2025-04-17 08:51

我有一个最外层的列表,这个列表记录了每个月不同物品的总数量,格式是这样的。每个月的物品都是一样的。

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

我该怎么做呢?任何帮助或启发都非常感谢。

4 个回答

0

我提出的解决方案:

[sublist.sort() for sublist in biglist]

之后,biglist 就会被排序。你不需要给列表推导式赋值!

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]
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 - 我们想用来排序的总和:{'项目 A': 42, '项目 B': 64, '项目 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')]]

这个解决方案适用于任何顺序的月份列表,并且即使某些项目在某个月没有出现也能正常工作。

撰写回答