[英]Sort a list according two items inside tuples- Python
我会感谢一些帮助修复我的代码并取得正确结果的帮助。
假设我的列表(列表中的元组)可能具有3个输出,例如:
list1 = [('a', 3.30, '' ,'' ), ('b', 3.20, '' , '' ), ......]
list2 = [('a', 3.30, 2.90, '' ), ('b', 3.20, 2.95, '' ), ........]
list3 = [('a', 3.30, 2.90, '' ), ('b', 3.20, '' , ''), ........]
我的清单总是在[1]处有价格,有时在[2]处有价。 我想按所有价格对清单排序。 我的以下代码对于list1和list2示例效果很好。
from operator import itemgetter
sort_list = sorted(list, key=itemgetter(1))
sort_list = sorted(sort_list, key=itemgetter(2))
print(sort_list)
但是对于list3
效果不佳,因为它可以识别[2]的空单元格,并且首先短路。 如果有的话,我想忽略一个空单元的价格。 所以list3
的打印输出应该是
('a', 3.30, 2.90, '' ), ('b', 3.20, '' , '')
。
因为2.90 < 3.20
而我忽略了空白
谢谢
书面回答问题:
使用lambda tup: [x for x in tup[2:0:-1] if not isinstance(x, str)]
的key
功能lambda tup: [x for x in tup[2:0:-1] if not isinstance(x, str)]
。 不必费心对两次排序,这会一次对两个值进行一次排序:
list3 = [('a', 3.30, 2.90, '' ), ('b', 3.20, '' , '')]
sort_list = sorted(list3 , key=lambda tup: [x for x in tup[2:0:-1] if not isinstance(x, str)])
print(sort_list)
输出:
[('a', 3.3, 2.9, ''), ('b', 3.2, '', '')]
以此处的key
函数为例,它按顺序切出索引2和1。 当其中一个是str
,它会忽略它,否则会将其保留为键的一部分。 因此('a', 3.3, 2.9, '')
产生[2.9, 3.3]
的key
,而('b', 3.2, '', '')
产生[3.2]
的key
。
我警告您,这会使任何维护您代码的人感到困惑; 在普通代码中,无条件地将位置n与位置n进行比较,在某些情况下,没有一个位置n不存在的情况,导致在另一个元素中将位置n与位置n-1进行比较。
另外请注意,Python不允许小数点使用逗号。 如果期望值是十分之三和十分之二,则您想要的文字为3.20
(或等效地为3.2
),而不是3,20
( 不等于3,2
); 前者是预期的数值,后者是两个int
的tuple
( 3
和20
为不相关的值)。 您可能会认为3,20
,但仅是因为零填充了小数部分,所以在比较tuple
s时,它首先比较了整数部分,然后是小数部分(由于被填充,因此可以正确比较)。 如果将3,3
与3,20
进行比较,则会得到错误的排序,因为3.3
大于3.20
(尾随的零无关紧要),而3,3
则小于3,20
(因为3
s等于20
大于3
)。 如果需要十进制精度,则使用decimal.Decimal
类型,但是如果这是玩具代码,则使用float
; 使用两个int
的tuple
通常比其他任何一个选项更容易出错。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.