6

我有如下列表:

mylist1 = ['alpha', 'green']
mylist2 = ['blue', 'alpha', 'red']

我想通过这个自定义排序列表对这两个列表进行排序:['red','blue','green','alpha']

这样mylist1 = ['green', 'alpha']mylist2 = ['red','blue','alpha']

我如何在 Python 中做到这一点?

4

3 回答 3

13

示范

>>> mylist1 = ['alpha', 'green']
>>> mylist2 = ['blue', 'alpha', 'red']
>>> sort_order = ['red', 'blue', 'green', 'alpha']
>>> mylist1.sort(key=sort_order.index)
>>> mylist1
['green', 'alpha']
>>> mylist2.sort(key=sort_order.index)
>>> mylist2
['red', 'blue', 'alpha']

说明

key参数 inlist.sort使列表通过比较而不是 来确定key(element)顺序element。例如,要进行不区分大小写的排序,您可以传递一个key使字符串小写的函数。比较小写元素,但保留原始元素:

>>> x = ["age", "Bonkers", "cheese"]
>>> x.sort()
>>> x
['Bonkers', 'age', 'cheese']
>>> str.lower("Bonkers")
'bonkers'    
>>> x.sort(key=str.lower)
>>> x
['age', 'Bonkers', 'cheese']

使用sort_order.indexfor 键使用元素在sort_order列表中的索引来确定顺序,而不是元素本身。因此'red'使用0'blue'使用1等...结果是要排序的列表根据每个元素所在的位置进行排序sort_order

于 2013-08-23T17:10:38.820 回答
4

使用索引作为键。

key=lambda x: customlist.index(x)
于 2013-08-23T17:10:18.413 回答
2

你可以使用:

>>> a = ['red','blue','green','alpha']
>>> b = ['alpha', 'green']
>>> filter(set(b).__contains__, a)
['green', 'alpha']

我们没有将列表按顺序排序,而是仅包含a源列表中存在的已排序列表中的元素b

如果需要,您可以将其编写为[el for el in a if el in b]并且可以选择b作为一个集合。

当然,如果您真的想要sort它,那么您可能应该构建索引查找而不是可能多次迭代列表(通过不断发出.index):

order = {v:i for i,v in enumerate(a)}
b.sort(key=order.get)
于 2013-08-23T17:12:23.867 回答