繁体   English   中英

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

[英]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 ); 前者是预期的数值,后者是两个inttuple320为不相关的值)。 您可能会认为3,20 ,但仅是因为零填充了小数部分,所以在比较tuple s时,它首先比较了整数部分,然后是小数部分(由于被填充,因此可以正确比较)。 如果将3,33,20进行比较,则会得到错误的排序,因为3.3大于3.20 (尾随的零无关紧要),而3,3则小于3,20 (因为3 s等于20大于3 )。 如果需要十进制精度,则使用decimal.Decimal类型,但是如果这是玩具代码,则使用float 使用两个inttuple通常比其他任何一个选项更容易出错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM