根据元组中的两项对列表进行排序-Python

时间:2018-09-11 19:44:40

标签: python python-3.x

我将感谢一些帮助修复代码并取得正确结果的帮助。

假设我的列表(列表中的元组)可能具有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,我忽略了空白

谢谢

1 个答案:

答案 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,203,2tuple是无关的值)。您可能会认为int有用,但是仅因为您零填充了小数部分,所以在比较3时,它首先比较了整数部分,然后是小数部分(由于有填充,所以比较了正确)。但是,如果您将203,20进行比较,则会得到不正确的排序,因为tuple大于3,3(尾随的零无关紧要),{{1 }}小于3,20(因为3.3相等,并且3.20大于3,3)。如果需要十进制精度,则使用3,20类型,但是如果这是玩具代码,则使用3;与两个其他选项之一相比,使用两个20中的3通常更容易出错。