[英]Python: How to sort a list based on another list
我想根据list2中的字符串来命令list1。 list1中与list2不对应的任何元素都应放在正确排序的list1的末尾。
例如:
list1 = ['Title1-Apples', 'Title1-Oranges', 'Title1-Pear', 'Title1-Bananas']
list2 = ['Bananas', 'Oranges', 'Pear']
list1_reordered_correctly= ['Title1-Bananas','Title1-Oranges','Title1-Pear','Title1-Apples']
这是一个想法:
>>> def keyfun(word, wordorder):
... try:
... return wordorder.index(word)
... except ValueError:
... return len(wordorder)
...
>>> sorted(list1, key=lambda x: keyfun(x.split('-')[1], list2))
['Title1-Bananas', 'Title1-Oranges', 'Title1-Pear', 'Title1-Apples']
为了使它更整洁和更有效( index
必须遍历列表以找到正确的项目),考虑将您的单词顺序定义为字典,即:
>>> wordorder = dict(zip(list2, range(len(list2))))
>>> wordorder
{'Pear': 2, 'Bananas': 0, 'Oranges': 1}
>>> sorted(list1, key=lambda x: wordorder.get(x.split('-')[1], len(wordorder)))
['Title1-Bananas', 'Title1-Oranges', 'Title1-Pear', 'Title1-Apples']
这个答案是概念性的而不是有效的。
st1dict = dict((t.split('-')[1],t) for t in st1) #keys->titles
list2titles = list(st1dict[k] for k in list2) #ordered titles
extras = list(t for t in st1 if t not in list2titles) #extra titles
print(list2titles+extras) #the desired answer
一个班轮。
sorted_list = sorted(list1, key=lambda x: list2.index(x.split('-')[1]) if x.split('-')[1] in list2 else len(list2) + 1)
使用下面的代码来实现所需的排序:
list1 = ['Title1-Apples', 'Title1-Oranges', 'Title1-Pear', 'Title1-Bananas']
list2 = ['Bananas', 'Pear']
# note: converting to set would improve performance of further look up
list2 = set(list2)
def convert_key(item):
return int(not item.split('-')[1] in list2)
print sorted(list1, key=convert_key)
# ['Title1-Pear', 'Title1-Bananas', 'Title1-Apples', 'Title1-Oranges']
这样的事情会让你继续这样做。
l = ['Title1-Apples', 'Title1-Oranges', 'Title1-Pear', 'Title1-Bananas']
l2 = ['Bananas', 'Oranges', 'Pear']
l3 = []
for elem_sub in l2:
for elem_super in l:
if elem_sub in elem_super:
l3.append(elem_super)
print(l3 + list(set(l)-set(l3)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.