Python 这是一种基于另一个列表对列表进行排序的糟糕方法吗';排序排列?

Python 这是一种基于另一个列表对列表进行排序的糟糕方法吗';排序排列?,python,list,sorting,Python,List,Sorting,问题: 我有一个列表列表,rowData,其中包含表格格式的其他列表,即 rowData = [strLabel, intA, intB] 我想根据intA和intB 所以如果 rowData = [ ['hi', 0, 1], ['how', 0, 0], ['ru', 2, 2] ] 我想以 rowData = [ ['how', 0, 0], ['hi', 0, 1], ['ru'

问题:

我有一个列表列表,
rowData
,其中包含表格格式的其他列表,即

rowData = [strLabel, intA, intB]
我想根据
intA
intB

所以如果

rowData = [ ['hi', 0, 1], 
            ['how', 0, 0],
            ['ru', 2, 2] ]
我想以

rowData = [ ['how', 0, 0], 
             ['hi', 0, 1], 
             ['ru', 2, 2] ]
当前解决方案:

目前我有一个单独的列表
sums
,对应于
intA
intB
对应的第二列和第三列的总和。我的解决方案:

[rowData[i] for i in [sums.index(j) for j in sorted(sums)]]

经过一段时间的搜索,这是唯一对我有意义的方法,但我对它的效率很有信心,并且想知道它与其他(希望是短的)替代方法相比效率有多低。

您可以将关键参数传递给
sort()
sorted()
函数,使用lambda表达式,该表达式将定义要进行排序的键

rowData = [ ['hi', 0, 1], 
             ['how', 0, 0],
             ['ru', 2, 2] ]

rowData.sort(key = lambda x:(x[1]+x[2]))

print rowData
>>> [['how', 0, 0], ['hi', 0, 1], ['ru', 2, 2]]
或者,如果要保留
rowData
的内容,则可以使用
sorted()

sortedData = sorted(rowData, key = lambda x:(x[1]+x[2]))

是的,使用
索引几乎总是不好的,原因有两个:

  • 这意味着您必须通过对每个值的
    和进行线性搜索,使整个算法花费二次时间而不是对数线性时间。例如,如果有10000个对象,则需要100000000个步骤,而不是13288个步骤
  • If意味着如果你有任何重复的和,你会得到错误的结果。例如,
    [0,1,0]。索引(0)
    [0,1,0]。索引(1)
    [0,1,0]。索引(0)
    将为您提供
    0,1,0
    ,而不是
    0,1,2
  • 通常,解决方法是
    enumerate
    zip

    例如,
    enumerate(sums)
    为您提供了
    (index,sum)
    对,因此您可以使用
    排序(enumerate(sums),key=itemgetter(1))
    值对它们进行排序,然后您可以使用这些索引:

    [rowData[i] for i, value in sorted(enumerate(sums), key=itemgetter(1))]
    
    或者您可以
    zip
    rowData
    sums
    组合成
    (sum,rowData)
    对,然后
    排序(zip(sums,rowData))
    按总和对这些对排序,然后您只需提取
    rowData
    s:

    [row for s, row in sorted(zip(sums, rowData))]
    
    (或者,您也可以将这些对解压缩到两个单独的列表中,只保留第二个列表。)