我有一个列表:如何根据python中的列表列表对列表进行排序?
a = ["x", "y", "z"]
我列出的另一个列表:
b = [["y", 99], ["w", 65], ["z", 150]]
所以,我想在a
项目进行排序,按降序排列在b
的值,从而排序a
应该是这样的:
sorted_a = ["z", "y", "x"]
这里"x"
是在最后,BEC因为它在b
中没有价值。
我想知道实现这个最快的方法,因为我的真实名单很大。
我有一个列表:如何根据python中的列表列表对列表进行排序?
a = ["x", "y", "z"]
我列出的另一个列表:
b = [["y", 99], ["w", 65], ["z", 150]]
所以,我想在a
项目进行排序,按降序排列在b
的值,从而排序a
应该是这样的:
sorted_a = ["z", "y", "x"]
这里"x"
是在最后,BEC因为它在b
中没有价值。
我想知道实现这个最快的方法,因为我的真实名单很大。
您可以使用defaultdict
和b
添加值到defaultdict
,然后更改的sorted
的key
到b_dict[x]
,将根据与x
在b
相关的值进行排序,如果该值不存在b
,默认值是0
,所以它会排序到最后。
from collections import defaultdict
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
b_dict = defaultdict(int, b)
sorted_a = sorted(a, key=lambda x: b_dict[x], reverse=True)
print(sorted_a)
# ["z", "y", "x"]
@Moe A的回答使用dict.get(x, 0)
,使用defaultdict
的2.42482
一个timeit值@ abccd的答案(我的),用timeit值2.88044
@RomanP erekhrest的答案用两个sorted
功能,用的timeit值2.97899
我想知道实现这一
最快的方法,那么我建议使用@Moe A的回答是因为它是迄今为止最快和最简单的答案。
可以使用dict.get()
作为为0的默认值的键转换b
到字典和排序,例如:
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
lowest = float('-inf')
tmp = dict(b)
sorted_a = sorted(a, key=lambda x: tmp.get(x, lowest), reverse=True)
# sorted_a = ["z", "y", "x"]
编辑:
为了避免错误的结果有当负数字,我将.get()
的默认值更改为-inf
,因此b
中不存在的元素在排序列表中排在最后。如果您在b
中没有负值,请将其保留为tmp.get(x, 0)
。
随着sorted
功能:
a = ["x", "y", "z"]
b = [["y", 99], ["w", 65], ["z", 150]]
b_sorted = [i[0] for i in sorted(b, key=lambda x: x[1], reverse=True)]
a_sorted = sorted(a, key=lambda x: b_sorted.index(x) if x in b_sorted else len(a))
print(a_sorted)
输出:
['z', 'y', 'x']
您不必在'B'关联到'x'的值。无论如何,你可以用一个闭包来对数组进行排序,这个闭包扫描'b'来获得'x'的值。 –