Python:如何根据另一个列表对列表进行排序

3

我希望按照list2中的字符串对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']
5个回答

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需要遍历列表以查找正确的项),建议将单词顺序定义为字典形式,例如:
```python word_order = { 'apple': 1, 'orange': 2, 'banana': 3 } ```
这样,您可以直接通过单词来获取它的排名而不需要进行额外的遍历。
>>> 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

一行代码。

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

如果您添加一些解释和文档链接,那么答案就会变得更有价值,这样原始发布者和其他用户就可以从中学习。 - Markus Safar

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接