【问题标题】:Sorting a list of lists when not all the values exist当并非所有值都存在时对列表列表进行排序
【发布时间】:2017-04-30 04:06:19
【问题描述】:

我正在尝试对列表列表进行排序,但内部列表的长度不同。例如:

version_list = [[1, 1, 2], [1, 0], [1, 3, 3], [1, 0, 12], [1, 0, 2], [2, 0, 0], [1, 1, 1]]

在没有第三个值的情况下,可以假设为0。我尝试过使用:

revision = sorted(version_list, key=lambda x: (x[2] if x[2] >= 0 else x[2] = 0))

因为我知道

revision = sorted(version_list, key=lambda x: x[1])
revision = sorted(version_list, key=lambda x: x[0])

两者都可以。

期望的结果是:

[[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]

任何帮助或建议将不胜感激。

【问题讨论】:

  • 你能显示预期的输出吗?
  • 你的意思是sorted(yourlist, reverse=True)?我认为您不需要实现匿名函数,Python 本身就支持您尝试做的事情。
  • 我正在寻找的输出是 [[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1 , 1, 2], [1, 3, 3], [2, 0, 0]]。 sorted(list, reverse=True) 没有给出这个结果。
  • 哦,那么 sorted(yourlist) 应该可以工作。
  • @DoganAskan 只要不涉及负值。后备值为 0,因此负值应该出现在之前(而不是在 sorted 中没有 key 的情况下)。

标签: python python-2.7 list sorting lambda


【解决方案1】:

您可以在 key 中返回一个元组,其中第三个值取决于子列表的长度(如果子列表的长度不是 3,则使用 0):

>>> sorted(version_list, key=lambda x: (x[0], x[1], x[2] if len(x) == 3 else 0))
[[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]

如果您想先对特定索引进行排序,您可以随机排列 x[0]x[1]x[2] if len(s) == 3 else 0 部分。

如果您希望它更通用,也可以使用显式函数:

def padded(lst):
    desired_length = 3
    fallback_value = 0
    x = [fallback_value]*desired_length
    x[:len(lst)] = lst      # inserts list
    return x

sorted(version_list, key=padded)

但是,正如 comments (Dogan Askan) 中所述,如果不会有负值,您根本不需要 key-函数,因为列表比较有效(在您的示例案例中正确) ) 即使长度不同:

sorted(version_list)  # no key function

【讨论】:

    【解决方案2】:

    这就是你所追求的吗?似乎默认情况下 sorted 将完全满足您的需求。

    sorted(version_list)
    Out[103]: [[1, 0], [1, 0, 2], [1, 0, 12], [1, 1, 1], [1, 1, 2], [1, 3, 3], [2, 0, 0]]
    

    【讨论】:

      【解决方案3】:

      为了支持艾伦的回答,Python 的 sorted() 内置函数在底层使用 Timsort 算法工作,这正是您想要做的:将具有较少子元素的元素放在每个前面,例如[1, 0] 放在[1, 0, 5] 之前。

      【讨论】:

        猜你喜欢
        • 2016-06-20
        • 2010-09-19
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 2012-10-16
        相关资源
        最近更新 更多