【问题标题】:Python: Sort multidimensional list, but respecting internal incrementer [duplicate]Python:对多维列表进行排序,但尊重内部增量器[重复]
【发布时间】:2014-09-27 22:41:52
【问题描述】:

这可能是一个相当简单的问题 - 但我对 python 的防御相对较新! 情况是这样的 - 我已经将一个 CSV 文件加载到一个看起来像这样的列表中:

["4567", "59.0000", 7.0000", "1"]
["4567", "59.0000", 7.0000", "2"]
["4567", "59.0000", 7.0000", "5"]
["1234", "59.0000", 7.0000", "1"]
["1234", "59.0000", 7.0000", "2"]
["1234", "59.0000", 7.0000", "3"]

第一列是唯一的 id - 最后一列是需要保留的序列中的数字(我的问题的根源)。

我想按唯一 ID(第一行)排序,但要保持序列有序。所以我宁愿有这样的列表

["1234", "59.0000", 7.0000", "1"]
["1234", "59.0000", 7.0000", "2"]
["1234", "59.0000", 7.0000", "3"]
["4567", "59.0000", 7.0000", "1"]
["4567", "59.0000", 7.0000", "2"]
["4567", "59.0000", 7.0000", "5"]

显然,当我只对唯一 ID 进行排序时 - 序列会变得混乱。

这是一项可以一次性完成的简单任务,还是我需要遍历列表两次?怎么做到呢?我很无知。谢谢你的时间!

【问题讨论】:

  • 所以问题是:“如何按多个值排序?”

标签: python sorting csv


【解决方案1】:

这个问题似乎是“如何按多个值排序?”

如果是这样,请参阅How To: Sorting,它涵盖了这种情况和大多数其他情况。基本方法是使用key 函数返回一个元组,因为元组在 Python 中是可排序的。

# sort by 1st column, then 4th column (both as integer values)
sorted(rows, key = lambda r: (int(r[0]), int(r[3]))

现在,即使没有第 4 列(或者如果是行的 顺序,而不是第 4 列的值),我们仍然可以使用sorted uses is a stable sort 的事实。这意味着对于任何等价比较的项目/行,都会保留顺序。因此,以下结果(对于给定数据)与第一个排序相同:

# sort by 1st column (as integer); preserve the "row order" by stability
sorted(rows, key = lambda r: int(r[0]))

【讨论】:

  • sorted(l,key=lambda x:int(x[0],int[x[3]]))
【解决方案2】:

我建议使用类而不是列表列表。但您也可以在排序中使用键(排序比 list_.sort() 慢)或(暂时)更改子列表元素的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 2012-07-18
    • 2021-12-23
    • 1970-01-01
    • 2017-07-27
    相关资源
    最近更新 更多