Python 列表的自定义排序顺序

Python 列表的自定义排序顺序,python,list,sorting,Python,List,Sorting,我有如下清单: mylist1 = ['alpha', 'green'] mylist2 = ['blue', 'alpha', 'red'] 我想按此自定义顺序列表对这两个列表进行排序:['red'、'blue'、'green'、'alpha'] 因此mylist1=['green','alpha'] 和mylist2=['red'、'blue'、'alpha'] 如何在Python中实现这一点?使用索引作为键 key=lambda x: customlist.index(x) 演示: &

我有如下清单:

mylist1 = ['alpha', 'green']
mylist2 = ['blue', 'alpha', 'red']
我想按此自定义顺序列表对这两个列表进行排序:
['red'、'blue'、'green'、'alpha']

因此
mylist1=['green','alpha']
mylist2=['red'、'blue'、'alpha']


如何在Python中实现这一点?

使用索引作为键

key=lambda x: customlist.index(x)

演示

>>> 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']
说明

>>> 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']
list.sort中的
key
参数使列表通过比较
key(element)
而不是
element
来确定顺序。例如,要进行不区分大小写的排序,可以传递一个
函数,该函数使字符串小写。比较小写元素,但保留原始元素:

>>> x = ["age", "Bonkers", "cheese"]
>>> x.sort()
>>> x
['Bonkers', 'age', 'cheese']
>>> str.lower("Bonkers")
'bonkers'    
>>> x.sort(key=str.lower)
>>> x
['age', 'Bonkers', 'cheese']
使用
sort\u order.index
键使用元素在
sort\u order
列表中的索引来确定顺序,而不是元素本身。所以
'red'
使用
0
'blue'
使用
1
,等等。。。结果是要排序的列表根据每个元素的排序顺序进行排序。您可以使用:

>>> a = ['red','blue','green','alpha']
>>> b = ['alpha', 'green']
>>> filter(set(b).__contains__, a)
['green', 'alpha']
我们只包含源列表
b
中存在的已排序列表
a
中的元素,而不是将列表按顺序排序

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

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


不是很像蟒蛇。你能解释一下发生了什么吗?@Dirk不知道我明白你的意思吗?它有理想的输出。。。只是没有对列表进行物理排序,因为输出不需要对指定的输出进行排序操作。我想问另一个与此原始帖子相关的问题。我应该创建一个新问题还是添加它作为一个评论??@mensah创建一个新问题这取决于你的跟进有多不同。首先,编辑你的问题,如果它看起来太不一样,可能会有人告诉你。
sort_order={v:i for i,v in enumerate(['red'、'blue'、'green'、'alpha'])}
以提高性能。@StevenRumbalski:没错,但那一行较长且不太明显,然后你需要
.sort(key=lambda el:sort_order[el])
。或
排序。\uuuu获取项目\uuuu
。无论哪种方式,它看起来都不太好,所以我会采用这种方法,除非速度最终很重要