首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有内置函数的情况下使用参数'key‘?

如何在没有内置函数的情况下使用参数'key‘?
EN

Stack Overflow用户
提问于 2021-04-25 05:06:55
回答 2查看 81关注 0票数 1

我正在用书学习python,在定义合并排序代码时有一个问题。

根据书中的条件,我成功地定义了代码。

问题在于参数键的使用。

我以前学过如何使用参数键。

据我所知,关键是改变比较标准的函数。

例如,它可以如下所示。我学到了。

代码语言:javascript
复制
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]

下面是我合并排序代码的一部分。

我知道的参数键是用作内建函数的参数值。

那么,我不能在没有内置函数的情况下使用下面代码中的键吗?

我想知道我能把钥匙放在哪里使用变化的排序条件。

代码语言:javascript
复制
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]
EN

回答 2

Stack Overflow用户

发布于 2021-04-25 05:09:11

在执行任何比较之前,要将Python函数应用于内置的key

代码语言:javascript
复制
if key(left[0]) <= key(right[0]):
    ...
票数 2
EN

Stack Overflow用户

发布于 2021-04-25 05:20:51

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

sorted有一个key参数之前,有一个名为“装饰-排序-卸载”的成语,它在对列表进行排序之前对其进行了转换,然后在排序后的列表上反转转换,以获得原始对象:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67249952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档