【问题标题】:Sorting a list in Python using the result from sorting another list [duplicate]使用排序另一个列表的结果在Python中对列表进行排序[重复]
【发布时间】:2012-03-21 12:59:44
【问题描述】:

我在 Python 中有两个列表

list_1 = [5, 2, 8];
list_2 = ['string1', 'string2', 'string3']

我想对第一个列表进行排序,然后使用结果对第二个列表进行排序。

换句话说,结果应该是:

# Sorted in descending order
list_1_sorted = [8, 5, 2];
list_2_sorted = ['string3', 'string1', 'string2'];

我知道如何单独对这些列表中的每一个进行排序,但是如何使用对另一个列表进行排序产生的索引排列来排列一个列表?

【问题讨论】:

  • 目前还不清楚你所说的“使用其他的结果”是什么意思。该示例并未说明为什么您不想单独对两个列表进行排序。
  • @prelic:他想对list_1进行排序,并使用相同的排列对list_2进行排序。

标签: python


【解决方案1】:

Schwartzian transform

list_1_sorted, list_2_sorted = zip(*sorted(zip(list_1, list_2),
  key=operator.itemgetter(0), reverse=True))

【讨论】:

  • 呃,我想弄清楚如何使用拆包来使它成为一个单一的衬里,但不够聪明。 +1 和“施瓦茨变换”。
  • key 在这里是不必要的,因为这已经是元组的自然排序顺序。除非您在list_1 包含重复项的情况下故意使排序不稳定...
【解决方案2】:

将列表压缩在一起,排序,解压缩列表:

together = zip(list_1, list_2)
sorted_together =  sorted(together)

list_1_sorted = [x[0] for x in sorted_together]
list_2_sorted = [x[1] for x in sorted_together]

这里发生的事情是 zip 创建了一个元组列表,其中您希望列表中的元素作为第一个元素进行排序:

>>> a = [1,3,7,3,2]
>>> b = ["one","two",'three','four','five']
>>> zip(a,b)
[(1, 'one'), (3, 'two'), (7, 'three'), (3, 'four'), (2, 'five')]

然后,当您对它们进行排序时,它们的元素保持配对:

>>> sorted(zip(a,b))
[(1, 'one'), (2, 'five'), (3, 'four'), (3, 'two'), (7, 'three')]

那么剩下的就是解压这些列表了。

【讨论】:

    【解决方案3】:

    你可以使用zip:

    >>> list_1 = ['string1', 'string2', 'string3']
    >>> list_2 = [5, 2, 8]
    >>> s = sorted(zip(list_2, list_1), reverse=True)
    >>> list_1_sorted = [e[1] for e in s]
    >>> list_2_sorted = [e[0] for e in s]
    >>> list_1_sorted
    ['string3', 'string1', 'string2']
    >>> list_2_sorted
    [8, 5, 2]
    >>> 
    

    【讨论】:

      【解决方案4】:

      @Ignacio 的答案是最好的,但如果您需要就地排序列表而不创建新列表,您可以试试这个:

      import itertools
      list_enumerate = itertools.count()
      
      list_2.sort(reverse=True, key=lambda k: list_1[next(list_enumerate)])
      list_1.sort(reverse=True)
      print list_1
      print list_2
      

      请注意,我认为不能保证每个列表项都按顺序调用 key 函数(这是正常工作所必需的),所以这是一种有风险的方法使用。

      【讨论】:

      • Python 中不存在“就地操作的要求”。您总是可以直接分配回去,如果您担心内存布局级别的优化,那么您无论如何都使用了错误的语言。
      • dodumentation 表示关键函数是“在进行比较之前在每个列表元素上调用”和“每个输入记录只调用一次”。我认为这几乎可以保证它们也以正确的顺序被调用。
      猜你喜欢
      • 2014-05-28
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2019-07-30
      • 2020-05-03
      相关资源
      最近更新 更多