【问题标题】:Sorting List of Lists列表排序列表
【发布时间】:2016-04-04 02:37:46
【问题描述】:

我得到了一个列表列表:

A = [[5, 0], [4, 1], [0, 31/3], [0, 4/3], [1, 0], [5/4, 7/4]]

并想这样排序:

[[5, 0], [4, 1], [5/4, 7/4], [1, 0], [0, 31/3], [0, 4/3]]

对于A.sort(reverse=True),我至少对第一个条目进行了排序。我有很多列表,因为它们假装是 nxm 矩阵。所以我不能将外部列表转换为一个集合,因为“行”(内部列表)可能会以这种方式被删除。

编辑:另一个例子:

A = [[0, 168, 14], [0, 156, 13], [64, 64, 104], [0, 48, 4], [0, 0, 272], [8, 8, 13], [0, 0, 153]]

应该排序为:

[[64, 64, 104], [8, 8, 13], [0, 168, 14], [0, 156, 13], [0, 48, 4], [0, 0, 272], [0, 0, 153]]

【问题讨论】:

  • 抱歉,为什么A.sort(reverse=True) 不起作用?在这两个示例中,结果都与您想要的输出相匹配。
  • 我也在想同样的事情......你的问题到底是什么?
  • 另外,第一个例子可能不会做你想要的,因为它是整数除法和 5/4 == 7/4 == 4/3 == 1
  • 除非是python3 @apsotic

标签: python list sorting matrix numbers


【解决方案1】:
from __future__ import division

A = [[0, 168, 14], [0, 156, 13], [64, 64, 104], [0, 48, 4], [0, 0, 272], [8, 8, 13], [0, 0, 153]]
B = [[5, 0], [4, 1], [0, 31/3], [0, 4/3], [1, 0], [5/4, 7/4]]

def getKey3(item):
    return item[0], item[1], item[2]

def getKey2(item):
    return item[0], item[1] 

print sorted(A, key=getKey3, reverse=True)   
print sorted(B, key=getKey2, reverse=True)

输出:

[[64, 64, 104], [8, 8, 13], [0, 168, 14], [0, 156, 13], [0, 48, 4], [0, 0, 272], [0, 0, 153]]
[[5, 0], [4, 1], [1.25, 1.75], [1, 0], [0, 10.333333333333334], [0, 1.3333333333333333]]

【讨论】:

  • 非常感谢!那行得通。在我重新启动我的笔记本后,A.sort(reverse=True) 也工作了......抱歉浪费你的时间!
【解决方案2】:

对于快速破解方法,已在您提供的 2 个样本上进行了测试:

A = [[5, 0], [4, 1], [0, 31/3], [0, 4/3], [1, 0], [5/4, 7/4]]
B = [[0, 168, 14], [0, 156, 13], [64, 64, 104], [0, 48, 4], [0, 0, 272], [8, 8, 13], [0, 0, 153]]

def K(ar):
  return sum(n*10**(4*i) for i, n in enumerate(reversed(ar)))

A = sorted(A, reverse=True, key=K)
print('result a', A)
B = sorted(B, reverse=True, key=K)
print('result b', B)

不过,为了获得更好的性能和已知的数学正确性,我会看看文档对使用 numpy 数组进行排序和比较的说法

编辑:另见https://wiki.python.org/moin/HowTo/Sorting/

【讨论】:

  • 非常感谢。我不知道是否允许我使用 sage、numpy 等软件包,因为我必须在具有不可修改 python 版本的服务器上测试我的脚本。
  • 不客气,希望对您有所帮助。顺便说一句,我在直观的基础上选择了这些常量,这些常量看起来足够大,至少可以大部分保留我们想要的排序规则,但仍然足够小,不会为合理大小的数组占用太多内存和时间。如果这是为了重要的事情,请在纸和铅笔上弄清楚这些是否值得使用
  • @TheDude,我添加了一个链接,其中包含一些干净可靠的排序方法,这些方法保留在标准库中
【解决方案3】:

我认为这里提出的其他解决方案过于复杂,sorted(A, reverse=True) 应该这样做。

演示:

In [15]: A = [[5, 0], [4, 1], [0, 31/3], [0, 4/3], [1, 0], [5/4, 7/4]]

In [16]: B = [[0, 168, 14], [0, 156, 13], [64, 64, 104], [0, 48, 4], [0, 0, 272], [8, 8, 13], [0, 0, 153]]

In [17]: sorted(A, reverse=True)
Out[17]: 
[[5, 0],
 [4, 1],
 [1.25, 1.75],
 [1, 0],
 [0, 10.333333333333334],
 [0, 1.3333333333333333]]

In [18]: sorted(B, reverse=True)
Out[18]: 
[[64, 64, 104],
 [8, 8, 13],
 [0, 168, 14],
 [0, 156, 13],
 [0, 48, 4],
 [0, 0, 272],
 [0, 0, 153]]

请注意,如果您使用的是 Python 2,则需要在脚本开头添加 from future import __division__ 以避免整数除法。

【讨论】:

    猜你喜欢
    • 2013-08-14
    • 2016-06-16
    • 2014-03-13
    • 2011-01-08
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多