提问人:Jess 提问时间:1/3/2023 最后编辑:phoJess 更新时间:1/3/2023 访问量:52
使用 Python [duplicate] 按另一个列表的顺序排序,其中该列表嵌套了 2 个排序键
Sort by order of another list, where that list is nested with 2 sort keys, using Python [duplicate]
问:
我知道如何对一个列表进行排序以匹配另一个列表的顺序。我还知道如何在两个键上对一个列表进行排序(使用 lamdba 函数,如 )。但是我需要对一个列表进行排序以匹配另一个列表的顺序,其中第二个列表有两个排序键。例如:key = lambda i: (i[0], i[1])
order_list = [['a', 2], ['c', 3], ['b', 1], ['e', 4]]
listB = [['c', 3, 'red', 'car'], ['e', 4, 'green', 'bus'], ['b', 1, 'blue', 'bike'], ['a', 2, 'yellow', 'plane']]
所需输出:
sorted_listB = [['a', 2, 'yellow', 'plane'], ['c', 3, 'red', 'car'], ['b', 1, 'blue', 'bike'],['e', 4, 'green', 'bus']]
我尝试写这个 - 即使它的形式很糟糕,我只是想看看它是否有效,但它没有:
def sort_key(x):
""" Find the matching element in reference sorted list
"""
# bad form, referencing non-local var
for a in order_list:
if a[0] == x[0] and a[1] == x[1]:
return a
sorted_listB = sorted(listB, key = sort_key)
关于如何做到这一点,有什么聪明的想法吗?最好不要将嵌套列表转换为单个键。我知道我能做到......试图扩展我的技能并以这种方式做到这一点,但我被卡住了。
答:
2赞
Dani Mesejo
1/3/2023
#1
一种方法:
order_list = [['a', 2], ['c', 3], ['b', 1], ['e', 4]]
listB = [['c', 3, 'red', 'car'], ['e', 4, 'green', 'bus'], ['b', 1, 'blue', 'bike'], ['a', 2, 'yellow', 'plane']]
# use a dictionary to map the values to the priorities
keys = {tuple(e): i for i, e in enumerate(order_list)}
# then use the first to elements of each sub-list to check for the priority
sorted_listB = sorted(listB, key=lambda x: keys.get(tuple(x[:2])))
print(sorted_listB)
print(sorted_listB)
输出
[['a', 2, 'yellow', 'plane'], ['c', 3, 'red', 'car'], ['b', 1, 'blue', 'bike'], ['e', 4, 'green', 'bus']]
或者,如果需要,可以使用枚举
将函数修复为返回索引值,如下所示:
def sort_key(x):
""" Find the matching element in reference sorted list
"""
# bad form, referencing non-local var
for i, a in enumerate(order_list):
if a[0] == x[0] and a[1] == x[1]:
return i
评论
1赞
Jess
1/3/2023
谢谢!我喜欢第一个......我被我的功能的糟糕形式所困扰。但是感谢您修复我的 sort_key() 函数 - 现在我明白为什么它不起作用了。我很感激。
评论
`
sorted_listB = sorted(listB, key = sort_key)
sort_key