如何将多个参数传递给sorted()的方法’key’?

在网站上,我试图根据用户的相对位置对商店列表进行排序.让我解释.

一家商店看起来像这样:

class Shop(models.Model):
    latitude = models.DecimalField(max_digits=9, decimal_places=6)
    longitude = models.DecimalField(max_digits=9, decimal_places=6)

我在会话中获得用户的位置.

request.session['user_latitude']
request.session['user_longitude']

所以现在我得到了一个商店列表,我想对它们进行排序.所以我尝试了这个:

def distance_of_the_shop(shop):
    # compute the distance between the shop and the user and return it
    return computed_distance

sorted(shop_list, key=distance_of_the_shop)

问题很简单,如何将多个参数传递给distance_of_the_shop方法?

只需将调用包装在lambda中:

ulong, ulat = request.session['user_latitude'], request.session['user_longitude']
sorted(shop_list, key=lambda shop: distance_of_the_shop(shop, ulong, ulat))

并向distance_of_the_shop()函数添加两个参数以接收经度和纬度.

sorted()函数为shop_list中的每个值调用键,但没有任何内容表示callable本身不能调用其他函数. lambda是创建新包装函数的最简单方法.

您还可以使用functools.partial() object,前提是经度和纬度值可以作为关键字参数传递,或者将这两个值作为前两个位置参数接受.将它们作为关键字参数处理可能是最好的,即使给它们一个位置(没有默认值),你也可以在partial()中使用它们的名字作为关键字参数.

假设定义是:

def distance_of_the_shop(shop, long, lat):
    # ...

然后用

sorted(shop_list, key=partial(distance_of_the_shop, long=ulong, lat=ulat))

而sorted()会将每个商店传递给partial(),而partial()又调用distance_of_the_shop(shop,long = ulong,lat = ulat)

相关文章
相关标签/搜索