我有以下列表:
mylist1 = ['alpha', 'green']
mylist2 = ['blue', 'alpha', 'red']
我想按此自定义有序列表对这两个列表进行排序:['red','blue','green','alpha']
以便mylist1 = ['green', 'alpha']
和mylist2 = ['red','blue','alpha']
我如何在Python中执行此操作?
答案 0 :(得分:10)
<强>示范强>:
>>> 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
中的list.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.index
使用元素在sort_order
列表中具有的索引来确定顺序而不是元素本身。因此'red'
使用0
,'blue'
使用1
等等...结果是要排序的列表根据每个元素所在的位置{{1 }}
答案 1 :(得分:4)
使用索引作为键。
key=lambda x: customlist.index(x)
答案 2 :(得分:1)
您可以使用:
>>> 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)