给定一个简化的示例进行排序:
l = [10, '0foo', 2.5, 'foo', 'bar']
我想对l
进行排序,以便数字总是在字符串之前。在这种情况下,我想获得[2.5, 10, '0foo', 'foo', 'bar']
。是否可以使数字和字符串临时可比(字符串总是比数字大)?
注意,如果您考虑的话,将key
功能提供给sorted
并不容易。例如,将数字转换为字符串无法正常工作,因为"10"
<"2.5"
。
您可能会这样做的一种方法确实涉及将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))
可以根据需要添加更多类型。