我正在用书学习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]下面是我合并排序代码的一部分。
我知道的参数键是用作内建函数的参数值。
那么,我不能在没有内置函数的情况下使用下面代码中的键吗?
我想知道我能把钥匙放在哪里使用变化的排序条件。
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]发布于 2021-04-25 05:09:11
在执行任何比较之前,要将Python函数应用于内置的key。
if key(left[0]) <= key(right[0]):
...发布于 2021-04-25 05:20:51
要有效地使用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。
https://stackoverflow.com/questions/67249952
复制相似问题