- 这是假设两个列表最初是共同排序的。
您可以使用函数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']
- 如果列表不是共同排序的,但唯一的区别是最后的
sales 字(或任何其他字),您可以简单地这样做:
import re
list2.sort(key=lambda s: re.sub("\s*sales$", "", s))
# list2 = ['River sales', 'River (N) sales', 'River (OTH) sales']
这将对列表进行排序,同时忽略结束词sales。我使用正则表达式来允许任意数量的空格。使用rstrip 可能会改变字符串的其他部分。
- 否则,这太具体了,需要具体的解决方案