使用存储在另一个列表中的自定义顺序对字符串列表排序



我有一个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中的值将被放在排序列表的后面。

您可以使用sortedkey使用直到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])
]

相关内容

  • 没有找到相关文章

最新更新