在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 A
和Item 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')]]
这个解决方案适用于任何顺序的月份列表,并且即使某些项目在某个月没有出现也能正常工作。