【问题标题】:Sorting a 2D list using template literals in Python在 Python 中使用模板文字对 2D 列表进行排序
【发布时间】:2021-12-10 23:44:55
【问题描述】:

我有一个名为data的二维列表

data = [['ABC', 12, 3, 100],
       ['DEF', 10, 5, 200],
       ['GHI', 13, 3, 1000]]

和2个随机数n1n2(不限于2个数字)。每当我运行我的程序时,n1 和 n2 将随机设置在 [0-3] 之间,因为数据有 4 列索引在 [0-3] 之间。之后,数据应根据 n1 和 n2 指向的列进行排序。

我们说

n1 = 2
n2 = 3

因此,列表现在应该首先按第二列排序,如果第二列中的值相同,则应根据第三列进行排序,依此类推,如下所示

[['ABC', 12, 3, 100],
['GHI', 13, 3, 1000],
['DEF', 10, 5, 200]]

我期待您的帮助。提前致谢

【问题讨论】:

  • 看看sort()/sorted()key参数就知道了。

标签: python arrays python-3.x list sorting


【解决方案1】:

使用operator.itemgetter

from operator import itemgetter


data = [['ABC', 12, 3, 100],
       ['DEF', 10, 5, 200],
       ['GHI', 13, 3, 1000]]


indices = [2, 3]

res = sorted(data, key=itemgetter(*indices))
print(res)

输出

[['ABC', 12, 3, 100], ['GHI', 13, 3, 1000], ['DEF', 10, 5, 200]]

这适用于任意数量的索引。

【讨论】:

  • 它按我的意愿工作。非常感谢你的帮助。我希望我有足够的声誉给你一个支持:)
  • @blackwings15 很高兴我能帮上忙
【解决方案2】:

您可以将元组传递给排序键:

sorted(data, key=lambda x: (x[n1],x[n2]))

【讨论】:

  • 如果我们有更多的排序参数,你会如何重新考虑你的代码?
【解决方案3】:

您可以利用列表中的.sort 方法,该方法接受key 的功能并且可以正常工作,即

data = [['ABC', 12, 3, 100],
       ['DEF', 10, 5, 200],
       ['GHI', 13, 3, 1000]]
data.sort(key=lambda x:(x[2],x[3]))
print(data)

输出

[['ABC', 12, 3, 100], ['GHI', 13, 3, 1000], ['DEF', 10, 5, 200]]

lambda 用于创建 2 元组,然后在排序期间用作值

【讨论】:

  • 如果我们有更多的排序参数,比如 3 或 4。我们如何修改解决方案?
  • @blackwings15 只是创建更大的元组,例如lambda x:(x[1],x[2],x[3])
  • 元组和索引的数量随机决定
  • @blackwings15 然后你可以使用理解,假设你得到indices 列表,这是[2,3] 对于你的情况和[1,2,3] 例如我在评论中提供,那么你可以使用@ 987654330@
  • 我猜这行得通。也谢谢你的帮助。我也会给你一个赞成票:)
【解决方案4】:

使用operator.itemgetter 作为排序键功能:

from operator import itemgetter

indices = [2, 3]

data.sort(key=itemgetter(*indices))
# [['ABC', 12, 3, 100], 
#  ['GHI', 13, 3, 1000], 
#  ['DEF', 10, 5, 200]]

【讨论】:

  • 对于动态数量的索引,原理完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2016-06-11
  • 1970-01-01
  • 2012-11-21
  • 2011-12-22
相关资源
最近更新 更多