使用lambda排序功能按每个元组组合值对字符串元组进行排序

时间:2019-09-05 10:54:37

标签: python sorting lambda tuples

我有一个元组列表,其中每个元组(a,b)代表对象a * b的高度:

L = [("3m", "5cm"), ("10m", "77cm"), ("1m", "82cm"), ("1m", "74cm"), ("11m", "50cm")] 

现在,我想使用lambda排序功能根据高度对该列表进行排序。输出应如下所示:

L = [("1m", "74cm"), ("1m", "82cm"), ("3m", "5cm"), ("10m", "77cm"), ("11m", "50cm")]

以下是我尝试过的方法,但出现错误:

L.sort(key= lambda x: 100 * int(x[0][0:-2]) + int(x[1][0:-3])) 

如何解决?

4 个答案:

答案 0 :(得分:2)

您的切片索引已关闭;结束索引是排他性的,因此您希望分别切片索引-1-2,使其:

L.sort(key=lambda x: 100 * int(x[0][:-1]) + int(x[1][:-2])) 

我也省略了起始索引(因为对于前向切片它默认为零)。另一个解决方案是使用rstrip,因此您无需使用幻数执行显式切片:

L.sort(key=lambda x: 100 * int(x[0].rstrip('m')) + int(x[1].rstrip('cm'))) 

请注意,rstrip会删除任何提供的字符的 runs ,因此,如果您的值不以预期的m和{ {1}},但是魔术切片会在更多情况下默默地纠正错误行为,因此这仍然是一个改进。

答案 1 :(得分:1)

您的错误是由于字符串的切片不正确所致。将这些问题分解成更小的部分总是有用的。切片第一个字符串时:

print(L[0][0][0:-2])
''

这将返回一个空字符串。按照您的注释,它实际上应该是L[0][0][0:-1],可以简化为L[0][0][:-1]。这是因为使用python切片符号a[start:stop]时,不包括切片的最后一个元素。我建议您检查this post,以便对切片符号的工作方式有更好的了解。所以你需要:

sorted(L, key = lambda x: int(x[0][:-1])*100 + int(x[1][:-2]))

[('1m', '74cm'),
 ('1m', '82cm'),
 ('3m', '5cm'),
 ('10m', '77cm'),
 ('11m', '50cm')]

答案 2 :(得分:1)

使用replacemcm或任何类似.strip("cm")的姐妹方法

 L.sort(key= lambda x: 100 * int(x[0].replace('m','')) + int(x[1].replace('cm','')))

答案 3 :(得分:1)

您不需要将每个元组转换为单个整数;一个整数元组就足够了((,假设您没有("1m", "105cm")这样的怪异高度)。

L.sort(key=lambda x: (int(x[0].strip("cm")), int(x[1].strip("cm"))))

列表的排序方式与元组相同,因此您可以通过列表理解来简化此操作。

L.sort(key=lambda p: [int(x.strip("cm")) for x in p])

元组和列表在字典上进行比较:一次比较一个元素,第一对非等价元素确定结果。