【问题标题】:Sort only the first two elements in each sub-array of 3 elements仅对每个 3 个元素的子数组中的前两个元素进行排序
【发布时间】:2018-01-22 19:57:45
【问题描述】:

我有一个数组:

list=[[1, 2, 3], [31, 10, 2], [7, 2, 4]]

我想对每个子数组中仅有的前两个元素进行排序(按升序排列)。

列表应如下所示:

list=[[1, 2, 3], [10, 31, 2], [2, 7, 4]]

我以前做的代码是:

list=[[1, 2, 3], [10, 31, 2], [2, 7, 4]]
for i in list:
  if list[0]>list[1]:
    list[0],list[1]=list[1],list[0]
  else:
    print('Do Nothing')

有没有更快的方法?

【问题讨论】:

  • 可能不显着。您的代码是否遇到性能问题?
  • 如果这是性能瓶颈,您可能应该首先使用一些其他数据结构(......也许)。可能有无分支的方法,但很难推断它们是否更好。
  • 您可以将这项工作卸载到 numpypandas 以加快速度。
  • “更快”是什么意思?
  • 每个子列表是否总是只有三个元素?

标签: python arrays sorting


【解决方案1】:

我认为这不会起作用,因为您只是在列表的前两个子列表之间切换。 (list[0]list[1],而不是 list[i][0]list[i][1]

我会使用这样的东西:

list_unsorted = [[1, 2, 3], [31, 10, 2], [7, 2, 4]]
list_sorted = [ [min(i[0], i[1]), max(i[0], i[1]), i[2] ] for i in list_unsorted ]

另外,我将 list 重命名为 list_unsorted,因为 list 已经是 python 中的一个函数。

【讨论】:

    【解决方案2】:

    更快,不是没有更多关于如何获取输入的上下文,并且可以访问更多工具 - 例如 numpy。

    但也许是一种更 Pythonic 的方式:

    alist=[[1, 2, 3, 5], [31, 10, 2], [7, 2, 4]]
    
    def p(l):
      a,b,c=l[0], l[1], l[2:]
      if a>b:
        a,b=b,a
      return [a,b, *c]
    
    print(list(map(p, alist)))
    

    这可以通过在代码中使用变量“list”而不是变量“i”来防止错误之王,因为它会被解释器检测到。

    作为一个好习惯,由于 list 是一个 python 关键字,它不应该用作变量名。

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多