![](/img/trans.png)
[英]Sorting list of tuples by first element of each tuple - Python 2.7
[英]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 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
我该如何实现? 任何帮助或启示将不胜感激。
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.