繁体   English   中英

这是根据另一个列表的排序排列对列表进行排序的不好方法吗?

[英]Is this a bad way to sort a list based on another list's sorted permutation?

问题:

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

rowData = [strLabel, intA, intB]

我想基于intAintB值的总和rowData进行排序

因此,如果

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

我想结束

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

当前解决方案

目前,我有一个单独的列表sums ,它对应于与intAintB对应的第二个和第三个“列”的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几乎总是坏的,原因有两个:

  1. 这意味着您必须通过每个值的sums进行线性搜索,使整个算法采用二次时间而不是对数线性。 例如,如果您有10000个对象,则需要100000000步而不是大约13288步。
  2. 如果意味着如果您有任何重复的金额,您将得到错误的结果。 例如, [0, 1, 0].index(0) [0, 1, 0].index(1)[0, 1, 0].index(0)会给你0, 1, 0 ,而不是0, 1, 2

一般来说,围绕它的方式是enumeratezip

例如, 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))]

或者你可以将rowDatasums一起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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM