我正在尝试根据第二个列表的顺序对列表进行排序。我的方法目前如下:
DEPARTMENT SECTION SUBSECTION
---------- --------- -----------
A A1 A101
A102
A2 A201
A202
B B1 B101
B102
B2 B201
B202
它没有将letters = ["m", "h", "a"]
order = ["h", "a", "m"]
sorted(letters, key=lambda letters: order.index(letters[0]))
print(letters)
排序为与letters
(第二个列表)相同,而是使order
保持不变。任何帮助将不胜感激,谢谢!
答案 0 :(得分:3)
要按order
的索引正确排序,您需要执行以下操作:
sorted(letters, key=lambda letters: order.index(letters))
在这种情况下,也可以使用letters[0]
,因为字符串只有长度1,但是在您可以自行调用letters
时不需要。
但是,由于调用index()
是 O(N),因此更好的方法是将索引存储在经过验证的字典映射中:
sort_map = {e: i for i, e in enumerate(order)}
sorted(letters, key=lambda x: sort_map[x])
确保订单查询为 O(1)。
答案 1 :(得分:2)
除了@RoadRunner的答案外,不需要手动调用索引,也不需要缓慢的lambda
,而是自动执行!!
也是这样:
sorted(letters, key=order.index)
要添加到@Shayn的答案中,请执行以下操作:
letters.sort(key=order.index)
答案 2 :(得分:0)
letters = ["m", "h", "a"]
order = ["h", "a", "m"]
letters = [x for x in order if x in letters]
print(letters)