【问题标题】:How can I sort two lists identically?如何对两个列表进行相同的排序?
【发布时间】:2019-07-01 10:21:45
【问题描述】:

我有两个 Python 列表如下:

 list1 = ['River (OTH)', 'River (N)', 'River']
 list2 = ['River (OTH) sales', 'River (N) sales', 'River sales']

我用代码对上面的列表进行了排序:

list1.sort()   
list2.sort()

排序后我得到的列表为:

list1 = ['River', 'River (N)', 'River (OTH)']
list2 = ['River (OTH) sales', 'River (N) sales', 'River sales'] 

我还需要将list2 排序为:

list2 = ['River sales', 'River (N) sales', 'River (OTH) sales']

我怎样才能做到这一点?

【问题讨论】:

  • 在第二个列表中应用 sort 不会提供您编写的输出,而是:['River (N) sales', 'River (OTH) sales', 'River sales']。如果您正在寻找相反的顺序,请致电sorted(list, reverse=True)

标签: python python-3.x list sorting


【解决方案1】:
  1. 这是假设两个列表最初是共同排序的。

您可以使用函数zip 将两个列表“粘合”在一起,然后根据list1 的元素对这个新列表进行排序,然后将它们分开。更容易展示:

list1=['River (OTH)','River (N)','River']
list2=['River (OTH) sales','River (N) sales','River sales']

zip_list = list(zip(list1, list2))
#  zip_list = [('River (OTH)', 'River (OTH) sales'), ('River (N)', 'River (N) sales'), ('River', 'River sales')]

zip_list.sort(key=lambda elem: elem[0])
#  zip_list = [('River', 'River sales'), ('River (N)', 'River (N) sales'), ('River (OTH)', 'River (OTH) sales')]

sorted_list1 = [elem[0] for elem in zip_list]
#  sorted_list1 = ['River', 'River (N)', 'River (OTH)']

sorted_list2 = [elem[1] for elem in zip_list]
#  sorted_list2 = ['River sales', 'River (N) sales', 'River (OTH) sales']
  • 请注意,根据this 的回答,您可以更有效地取回分离的列表。 (sorted_list1, sorted_list2 = [list(t) for t in zip(*zip_list)])

如果您想反转它,只需将 reverse=True 添加到 sort() 调用。

另一个有趣的解决方案是使用enumerate 来“记住”索引发生的变化:

indexed_list1 = list(enumerate(list1))
#  [(0, 'River (OTH)'), (1, 'River (N)'), (2, 'River')]

indexed_list1.sort(key=lambda x: x[1])
#  [(2, 'River'), (1, 'River (N)'), (0, 'River (OTH)')]

indices, sorted_list1 = (list(l) for l in zip(*indexed_list1))
#  sorted_list1 = ['River', 'River (N)', 'River (OTH)']
#  indices = [2, 1, 0]

sorted_list2 = [list2[i] for i in indices]
#  ['River sales', 'River (N) sales', 'River (OTH) sales']

  1. 如果列表不是共同排序的,但唯一的区别是最后的 sales 字(或任何其他字),您可以简单地这样做:
import re

list2.sort(key=lambda s: re.sub("\s*sales$", "", s))
# list2 = ['River sales', 'River (N) sales', 'River (OTH) sales']

这将对列表进行排序,同时忽略结束词sales。我使用正则表达式来允许任意数量的空格。使用rstrip 可能会改变字符串的其他部分。


  1. 否则,这太具体了,需要具体的解决方案

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2019-08-18
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    相关资源
    最近更新 更多