我有一个元组列表,其中每个元组(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]))
如何解决?
答案 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)
使用replace
到m
和cm
或任何类似.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])
元组和列表在字典上进行比较:一次比较一个元素,第一对非等价元素确定结果。