【问题标题】:How to use parameter 'key' without built-in function?如何在没有内置函数的情况下使用参数'key'?
【发布时间】:2021-04-25 05:06:55
【问题描述】:

我正在用书学习python,在定义合并排序代码时有一个问题。
根据书中的条件,我成功定义了代码

问题是关于参数键的使用。
我之前已经学会了如何使用参数键。
据我所知,关键是改变比较标准的功能
例如,它可以如下使用。我学会了。

def selection_sort(xs, key=lambda x: x):
    ss = []
    while xs != []:
        smallest = min(xs, key=key)
        xs.remove(smallest)
        ss.append(smallest)

    return ss 

# Execution value of selection_sort
> selection_sort([4, -2, 3, -1, 5])
> [-2, -1, 3, 4, 5]
> selection_sort([4, -2, 3, -1, 5], key = abs)
> [-1, -2, 3, 4, 5]
> selection_sort([4, -2, 3, -1, 5], key= lambda x: -x)
> [5, 4, 3, -1, -2]

以下是我的合并排序代码的一部分。
我知道的参数键是用作内置函数的参数值。
那么下面代码中没有内置函数就不能使用key吗?
我想知道我可以将使用更改排序条件的关键放在哪里。

def merge(left,right, key = lambda x: x): # A function that merge sort two list
        ss = []
        while not (left == [] or right == []):
            if left[0] <= right[0]:
                ss.append( left[0] ) 
                left = left[1:]
            else:
                ss.append( right[0] ) 
                right = right[1:]
    
        ss.extend(left)  
        ss.extend(right)
        return ss

# Execution value of merge
merge([18, 23, 32], [7, 11, 55, 99])
> [7, 11, 18, 23, 32, 55, 99]

【问题讨论】:

    标签: python parameters mergesort


    【解决方案1】:

    内置sort 的Python key 函数旨在在执行任何比较之前立即应用。

    if key(left[0]) <= key(right[0]):
        ...
    

    【讨论】:

    • 我想我已经学会了如何接近,谢谢
    • 这实际上并不是sortedlist.sort 使用它们的key 函数的方式。他们每个项目只调用一次函数,而不是每次比较两次(这是一个更大的数字)。这更像是您可以传递给排序函数的 cmp 函数在 Python 2 中的工作方式,每次比较都会调用它。
    【解决方案2】:

    要有效地使用key 参数,您应该对列表中的每个对象只应用一次。您保留返回值,附加到数据项,并根据返回值而不是原始对象进行排序。

    sorted 有一个key 参数之前,有一个成语叫做“装饰-排序-不装饰”,它在排序之前对列表进行转换,然后在排序后的列表上反转转换以获取原始对象:

    def my_sort(data, key=lambda x: x):
        decorated_data = [(key(x), i, x) for i, x in enumerate(data)]   # decorate
    
        # replace this with your sorting logic
        sorted_results = sorted(decorated_data)                         # sort
    
        undecorated_results = [tup[2] for tup in sorted_results]        # undecorate
        return undecorated_results
    

    装饰步骤将data 中的每个值转换为一个三元组,从键函数返回的值开始,然后是一个整数(为了打破平局,如果某些项目应该按如下方式排序,这可能是必要的它们是平等的,并且对象本身是不可比较的)。该项目在元组中排在最后,因此当我们需要取消装饰并获取输出的项目列表时,我们会得到索引 2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多