在python中,如何根据列表列表对列表进行排序?

在python中,如何根据列表列表对列表进行排序?,python,list,sorting,Python,List,Sorting,我有一份清单: a = ["x", "y", "z"] 我有另一个列表: b = [["y", 99], ["w", 65], ["z", 150]] 因此,我想根据b中的值按降序对a中的项目进行排序,因此排序后的a应该如下所示: sorted_a = ["z", "y", "x"] 这里x是最后一个,因为它在b中没有值 我想知道实现这一点的最快方法,因为我的实际列表很大。您可以使用defaultdict并将b中的值添加到defaultdict,然后将sorted键更改为b_dict[x]

我有一份清单:

a = ["x", "y", "z"]
我有另一个列表:

b = [["y", 99], ["w", 65], ["z", 150]]
因此,我想根据b中的值按降序对a中的项目进行排序,因此排序后的a应该如下所示:

sorted_a = ["z", "y", "x"]
这里x是最后一个,因为它在b中没有值

我想知道实现这一点的最快方法,因为我的实际列表很大。

您可以使用defaultdict并将b中的值添加到defaultdict,然后将sorted键更改为b_dict[x],它将根据b中与x关联的值进行排序,如果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.getx,0,timeit值为2.42482

@abccd的答案是使用defaultdict,timeit值为2.88044

@RomanPerekhrest的答案使用两个排序函数,timeit值为2.97899

结果: 我想知道实现这一目标的最快方法

然后我建议使用@Moe A的答案,因为它是三个答案中最快、最简单的。

您可以使用defaultdict并将b中的值添加到defaultdict,然后将sorted键更改为b_dict[x],如果b中不存在该值,它将根据b中与x相关的值进行排序,默认值为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.getx,0,timeit值为2.42482

@abccd的答案是使用defaultdict,timeit值为2.88044

@RomanPerekhrest的答案使用两个排序函数,timeit值为2.97899

结果: 我想知道实现这一目标的最快方法

然后我建议使用@Moe A的答案,因为它是三个答案中最快、最简单的一个。

您可以将b转换为字典,并使用默认值为0的dict.get作为键进行排序,例如:

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 To-inf的默认值,以便b中不存在的元素在排序列表中排在最后。如果b中没有负值,则将其保留为tmp.getx,0。

您可以将b转换为字典,并使用默认值为0的dict.get作为键进行排序,例如:

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 To-inf的默认值,以便b中不存在的元素在排序列表中排在最后。如果b中没有负值,则将其保留为tmp.getx,0。使用排序函数:

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']
具有排序功能:

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的值,等等。你没有一个值与b中的x相关联。无论如何,您可以使用一个闭包对数组进行排序,该闭包扫描b以获取x等的值。您可以直接从列表b:b_dict=defaultint,b中初始化默认字典,并跳过forloop@Robb非常感谢。我忘了你可以这么做了:p并且走了很长的路..你可以直接从列表b:b_dict=defaultint,b中初始化默认字典,然后跳过forloop@Robb非常感谢。我忘了你能做到这一点:p,走了很长的路..a=sorteda,key=lambda x:tmp[x],reverse=Trueah,默认值@bulbus Yeah避免引发异常如果任何值为负,则可能会失败-为什么?负片应按sorteda=sorteda,key=lambda x:tmp[x],reverse=Trueah进行相应排序,作为默认值@bulbus Yeah避免引发异常如果任何值为负,则可能会失败-为什么?负片应按排序顺序进行相应排序