python - 了解 Python 中的闭包作用域

标签 python sorting scope closures

这是 Bratt Slatkin 书中的例子

def sort_priority(values,   group):
    def helper(x):
        if  x   in  group:
            return  (0, x)
        return  (1, x)
    values.sort(key=helper)

此外,他们还给出了这些值

numbers =   [8, 3,  1,  2,  5,  4,  7,  6]
group   =   {2, 3,  5,  7}
sort_priority(numbers,  group)
print(numbers)

我们有

[2, 3,  5,  7,  1,  4,  6,  8]

我不明白这个例子。为什么我们要返回两次,辅助函数实际上做了什么?

最佳答案

您将函数读作:

def helper(x):
    if x in group:
        return (0, x)
    else:
        return (1, x)

或者,更简洁地说,

def helper(x):
    return (x not in group, x)

这背后的直觉是sort接受 key在每个元素上调用的回调。对于每个元素,helper被调用返回一个元组(可以是 (0, x)(1, x) 取决于 x 是否存在于 VIP 列表中)。

您应该明白,元组是根据多个谓词进行排序的,这意味着在决定元素的顺序时会考虑元组中的两个项目。这意味着 group 返回的元素 (0, x)与返回的人相比,将首先订购 (1, x)因为0 < 1 .

在此之后,我们有两组,第一个元素为 0 的组和那些第一个元素1 .全部0组元素将排在第一位,但这些元素的顺序取决于元组中的第二项 - x .与 1 类似组元素。


供您输入:

Group0: [2, 3, 5, 7]
Group1: [8, 1, 4, 6]

Ordering within Group0: [2, 3, 5, 7]
Ordering within Group1: [1, 4, 6, 8]

Overall ordering: [Group0, Group1]

Result:  [2, 3, 5, 7,    1, 4, 6, 8]

关于python - 了解 Python 中的闭包作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45902677/

相关文章:

python - 如何在selenium中获取当前选项卡的url?

python - 如何获取 Python 类属性(而不是实例)的字典?

python heapq排序列表错误?

javascript - 按 3 的 block 对数组进行排序

python - 如何在 Python 中更改来自不同 .py 文件的变量值

c++ - 为什么这运行良好? (访问范围外变量的地址)

python - 在Python中获取整数的大端字节序列

python - 如何将字典值映射到具有列表值的数据框列

java - 根据优先级重新排列数组

php - 使用 Require_once() 正确包含数据库连接变量