给出这个简化的排序示例:
l = [10, '0foo', 2.5, 'foo', 'bar']
我想对l
进行排序,以便数字始终位于字符串之前。在这种情况下,我想获得[2.5, 10, '0foo', 'foo', 'bar']
。是否有可能使数字和字符串暂时具有可比性(字符串总是大于数字)?
请注意,如果您正在考虑将key
函数提供给sorted
并不容易。例如,将数字转换为字符串不会起作用,因为"10"
< "2.5"
。
答案 0 :(得分:1)
您可以这样做的方法包括将key
传递给已排序。它看起来像这样:
sorted(l, key=lambda x:(isinstance(x str), x))
这是有效的,因为键返回一个x类型及其值的元组。因为元组的比较方式。首先比较索引0处的项目,如果它们是相同的,则比较接下来的两个项目,依此类推它们是否相同。这允许按类型(字符串或不是字符串)对值进行排序,如果它们是类似的类型则为值。
更强大的解决方案也可以处理更多类型,可能会在键函数中使用字典,如下所示:
sorted(l,key=lambda x:({int:0, float:0, str:1, list:2, set:3}[type(x)], x))
可以根据需要添加更多类型。