使用 Python [duplicate] 按另一个列表的顺序排序,其中该列表嵌套了 2 个排序键

Sort by order of another list, where that list is nested with 2 sort keys, using Python [duplicate]

提问人:Jess 提问时间:1/3/2023 最后编辑:phoJess 更新时间:1/3/2023 访问量:52

问:

我知道如何对一个列表进行排序以匹配另一个列表的顺序。我还知道如何在两个键上对一个列表进行排序(使用 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)

关于如何做到这一点,有什么聪明的想法吗?最好不要将嵌套列表转换为单个键。我知道我能做到......试图扩展我的技能并以这种方式做到这一点,但我被卡住了。

Python 列表 排序 嵌套列表

评论

1赞 pho 1/3/2023
请参阅格式设置帮助。仅缩进代码的第一行可能会使其看起来格式正确,但相对于代码的其余部分,它会弄乱缩进。请缩进所有代码(使用编辑器中的代码块按钮)或将整个代码块括在代码围栏中(在代码前后的行上划三个反引号 ()`
0赞 pho 1/3/2023
这个问题似乎与按另一个列表的顺序排序相同。只有在这种情况下,其他列表中的元素才是列表本身,并且您可以通过对正在排序的项目进行切片来从列表中获取要排序的相应元素。
1赞 Karl Knechtel 1/3/2023
“我试着写这个”——这是定义中的错别字吗?(它仍然不起作用,但我想确定你是否抓住了它。而且潜在的推理非常接近,尽管它做得还不够,而且比必要的更复杂。sorted_listB = sorted(listB, key = sort_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() 函数 - 现在我明白为什么它不起作用了。我很感激。