2017-09-23 87 views
1

我有一个列表:如何根据python中的列表列表对列表进行排序?

a = ["x", "y", "z"] 

我列出的另一个列表:

b = [["y", 99], ["w", 65], ["z", 150]] 

所以,我想在a项目进行排序,按降序排列在b的值,从而排序a应该是这样的:

sorted_a = ["z", "y", "x"] 

这里"x"是在最后,BEC因为它在b中没有价值。

我想知道实现这个最快的方法,因为我的真实名单很大。

+1

您不必在'B'关联到'x'的值。无论如何,你可以用一个闭包来对数组进行排序,这个闭包扫描'b'来获得'x'的值。 –

回答

2

您可以使用defaultdictb添加值到defaultdict,然后更改的sortedkeyb_dict[x],将根据与xb相关的值进行排序,如果该值不存在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"] 

速度明智:

  1. @Moe A的回答使用dict.get(x, 0),使用defaultdict的2.42482

  2. 一个timeit值@ abccd的答案(我的),用timeit值2.88044

  3. @RomanP erekhrest的答案用两个sorted功能,用的timeit值2.97899

结果:

我想知道实现这一

最快的方法,那么我建议使用@Moe A的回答是因为它是迄今为止最快和最简单的答案。

+1

你可以直接从列表b中初始化默认字典:'b_dict = default(int,b)'并跳过for循环 – Robb

+0

@Robb谢谢你!我忘了你可以做到这一点:P和走了很长的路.. – abccd

5

可以使用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)

+0

'a = sorted(a,key = lambda x:tmp [x],reverse = True)' – kaza

+0

啊,为默认值! – kaza

+0

@bulbus是的,以避免引发异常 –

1

随着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'] 
相关问题