2016-02-12 152 views
4

我想根据list2中的字符串排序list1。列表1中与列表2不对应的任何元素应放置在正确排序的列表1的末尾。Python:如何根据另一个列表排序列表

例如:

list1 = ['Title1-Apples', 'Title1-Oranges', 'Title1-Pear', 'Title1-Bananas'] 
list2 = ['Bananas', 'Oranges', 'Pear'] 

list1_reordered_correctly= ['Title1-Bananas','Title1-Oranges','Title1-Pear','Title1-Apples'] 

回答

4

这里有一个想法:

>>> 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'] 
0

这个答案是概念性的,而不是高效。

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 
0

One liner。

sorted_list = sorted(list1, key=lambda x: list2.index(x.split('-')[1]) if x.split('-')[1] in list2 else len(list2) + 1) 
+0

如果要添加一些说明和文档链接答案可以变得更有价值,所以原来的海报和其他用户可以从它实际上学习。 –

0

使用下面的代码来实现所需的排序:

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'] 
0

像这样的让你去这一点。

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)))