[英]Is this a bad way to sort a list based on another list's sorted permutation?
问题:
我有一个列表列表, rowData
,包含表格格式的其他列表,即
rowData = [strLabel, intA, intB]
我想基于intA
和intB
值的总和对rowData
进行排序
因此,如果
rowData = [ ['hi', 0, 1],
['how', 0, 0],
['ru', 2, 2] ]
我想结束
rowData = [ ['how', 0, 0],
['hi', 0, 1],
['ru', 2, 2] ]
当前解决方案
目前,我有一个单独的列表sums
,它对应于与intA
和intB
对应的第二个和第三个“列”的intB
。 我的解决方案
[rowData[i] for i in [sums.index(j) for j in sorted(sums)]]
这是经过一段时间搜索后对我有意义的唯一方法,但我对其效率低下充满信心,并且想知道与其他(希望是短期的)替代方案相比效率是多么低效。
您可以使用lambda表达式将键参数传递给sort()
和sorted()
函数,该表达式将定义要在其上进行排序的键。
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]))
是的,使用index
几乎总是坏的,原因有两个:
sums
进行线性搜索,使整个算法采用二次时间而不是对数线性。 例如,如果您有10000个对象,则需要100000000步而不是大约13288步。 [0, 1, 0].index(0)
[0, 1, 0].index(1)
和[0, 1, 0].index(0)
会给你0, 1, 0
,而不是0, 1, 2
。 一般来说,围绕它的方式是enumerate
或zip
。
例如, enumerate(sums)
给出(index, sum)
对,因此您可以使用sorted(enumerate(sums), key=itemgetter(1))
对sums
值进行sorted(enumerate(sums), key=itemgetter(1))
,然后您可以使用这些索引:
[rowData[i] for i, value in sorted(enumerate(sums), key=itemgetter(1))]
或者你可以将rowData
和sums
一起zip
成(sum, rowData)
对,然后sorted(zip(sums, rowData))
按总和对这些对进行排序,然后你只需要提取rowData
:
[row for s, row in sorted(zip(sums, rowData))]
(或者,你也可以将这些对zip
回两个单独的列表,然后保留第二个列表。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.