我有一个2或3个字符串的列表,最后一个字符是相同的。
example_list = ['h1','ee1','hi1','ol1','b1','ol1','b1']
是否有办法按照另一个列表的顺序对这个列表进行排序?
order_list = ['ee','hi','h','b','ol']
所以答案应该是example_list.sort(use_order_of=order_list)
应该产生类似['ee1','hi1','h1','b1','b1','ol1','ol1']
的输出我在StackOverflow上发现了其他问题,但我仍然无法找到一个有好的解释的答案。
您可以构建一个将前缀映射到它们的排序键的order_map
,然后在调用sorted
:
example_list = ['h1','ee1','hi1','ol1','b1','ol1','b1']
order_list = ['ee','hi','h','b','ol']
order_map = {x: i for i, x in enumerate(order_list)}
sorted(example_list, key=lambda x: order_map[x[:-1]])
这比为每个元素调用order_list.index
有一个优点,因为从字典中获取元素是很快的。
您还可以通过使用默认值dict.get
来处理order_list
中缺失的元素。如果默认值很小(例如-1
),那么没有出现在order_list
中的值将被放在排序列表的前面。如果默认值很大(例如float('inf')
),那么没有出现在order_list
中的值将被放在排序列表的后面。
您可以使用sorted
和key
使用直到example_list
中每个元素的最后一个字符串:
sorted(example_list, key=lambda x: order_list.index(x[:-1]))
Ourput:
['ee1', 'hi1', 'h1', 'b1', 'b1', 'ol1', 'ol1']
注意,这假设example_list
中没有最后一个字符的所有元素都在order_list
像这样?它具有处理重复项的优点。
sorted_list = [
i
for i, _
in sorted(zip(example_list, order_list), key=lambda x: x[1])
]