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))]
(或者,您也可以将这些对解压缩到两个单独的列表中,只保留第二个列表。)