【问题标题】:Arbitrary but deterministic sort a list of incompatible types [closed]任意但确定性对不兼容类型列表进行排序[关闭]
【发布时间】:2022-01-11 13:54:12
【问题描述】:

我有以下配对列表:

test1 = [["A", 1],["A", 4], ["D", "Yes"], ["G", 12], ["B", True], ["H", "No"], ["G", 54], ["Z", 412.41]]
test2 = [["D", "Yes"], ["B", True], ["Z", 412.41], ["A", 4], ["G", 12], ["A", 1], ["G", 54], ["H", "No"]]

我希望能够将每个列表排序为确定的顺序。我不关心确切的顺序,但是如果我对两个相同的列表进行排序,那么我希望它们以相同的顺序结束。

我试过了:

test1.sort(key=lambda x: x[1])
test2.sort(key=lambda x: x[1])

但我得到了错误:

TypeError: '<' not supported between instances of 'str' and 'int'

如何对包含不兼容类型(如 str、bool、int、float)元素的列表进行一致的排序?

【问题讨论】:

  • 结果应该是什么?告诉您如何比较子列表的规则是什么——您希望它们按什么顺序排列,根据什么逻辑,为什么?通过这种排序方式,你希望解决什么问题
  • 不要调用列表列表 - 隐藏 list() 构建
  • 我强烈建议不要调用列表listlist 已经是 python 中内置类 list 的名称。将特定列表命名为 list 会造成混淆,实际上可能会导致意想不到的后果。
  • @KarlKnechtel 问题是我希望收到 2 个列表,其中包含相同的列表,我想比较它们,但顺序可能会混淆。所以在比较之前,我想确保它们的顺序相同。
  • 那么,任何一致的排序都行得通吗?给定的答案或多或少是我提出的,那么,是的。

标签: python list sorting


【解决方案1】:

这是一个建议:

list_1.sort(key=lambda x: (repr(type(x[1])), x[1]))

print(list_1)
# [['B', True], ['Z', 412.41], ['A', 1], ['A', 4], ['G', 12], ['G', 54], ['H', 'No'], ['D', 'Yes']]

这会将第二个元素具有相同类型的元素组合在一起。 x[1] 的实际值只会在类型不同时进行比较,因此您不会有 TypeError: '&lt;' not supported between instances of something and something else

注意412.41 是如何与其他号码隔离的,因为它是float,而其他号码是int

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 2016-03-01
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多