如何对两个列表进行相同排序?

时间:2019-07-01 10:21:45

标签: python-3.x list sorting

我有两个如下的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']

我该如何实现?预先感谢。

1 个答案:

答案 0 :(得分:2)

  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. 否则,这太具体了,需要具体解决方案