我有两个如下的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']
我该如何实现?预先感谢。
答案 0 :(得分:2)
您可以使用函数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']
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
可能会更改字符串的其他部分。