我将感谢一些帮助修复代码并取得正确结果的帮助。
假设我的列表(列表中的元组)可能具有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
,我忽略了空白
谢谢
答案 0 :(得分:0)
回答中的问题:
使用key
的{{1}}函数。不必费心排序两次,这可以一次通过两个值:
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, '', '')]
函数为例,它按该顺序切出索引2和1。当其中一个是key
时,它将忽略它,否则将其保留为密钥的一部分。因此,str
产生('a', 3.3, 2.9, '')
的{{1}}值,而key
仅产生[2.9, 3.3]
的{{1}}值。
我会警告您,这会使任何维护您代码的人感到困惑;在普通代码中,您无条件地将位置n与位置n进行比较,在某些情况下不会出现位置n不存在的情况,而是将位置n与位置n-1在另一元素中进行比较。
还要注意,Python不允许您使用逗号作为小数点;如果期望值是十分之三和十分之二,则您想要的文字是('b', 3.2, '', '')
(或等效地为key
),而不是[3.2]
( not 等效于3.20
);前者是预期的数值,后者是两个3.2
中的3,20
(3,2
和tuple
是无关的值)。您可能会认为int
有用,但是仅因为您零填充了小数部分,所以在比较3
时,它首先比较了整数部分,然后是小数部分(由于有填充,所以比较了正确)。但是,如果您将20
与3,20
进行比较,则会得到不正确的排序,因为tuple
大于3,3
(尾随的零无关紧要),{{1 }}小于3,20
(因为3.3
相等,并且3.20
大于3,3
)。如果需要十进制精度,则使用3,20
类型,但是如果这是玩具代码,则使用3
;与两个其他选项之一相比,使用两个20
中的3
通常更容易出错。