【问题标题】:Using Lambda as a Key function in SORT在 SORT 中使用 Lambda 作为 Key 函数
【发布时间】:2018-02-04 04:59:16
【问题描述】:

我有一本以公司名称为键的字典。这些值是两个事物的命名元组。具有指向公司网址的链接和具有数值的等级的实体。我想根据价值特别是按等级对这本字典进行排序。我正在尝试将 key 函数用作 key=lambda (k,v):v.grade。但是我在 lambda 关键字旁边的括号处收到一个错误。代码 sn-p 如下。有人可以帮忙吗?

sorted_dict = sorted(list(dict_interested_companies.items()), key=lambda (k,v):v.grade)

例如显示dict.items()的值

[('Google', named_tuple(entity='http://money.cnn.com/video/technology/2018/02/01/kevin-abosch-i-am-a-coin.cnnmoney/index.html',grade=45)), ('Comcast', named_tuple(entity='http://money.cnn.com/2018/02/02/pf/college/public-service-student-loan-forgiveness/index.html',grade=39))

【问题讨论】:

标签: python lambda namedtuple


【解决方案1】:

key 函数不应该有两个参数。它总是会接受一个论点。碰巧在这种情况下,参数是一个 2 元组,但它仍然是一个参数。

# This is a function taking two arguments,
# *not* a function taking a tuple.
lambda k, v: v.grade

# This is equivalent to the above in Python
# 2 but has been disallowed in Python 3. Don't
# use this syntax; it's not portable.
lambda (k, v): v.grade

# This is a function taking one argument, a tuple,
# and using its second element. This is what you want.
lambda x: x[1].grade

【讨论】:

  • 感谢您的回答。我不知道 Python 3 中禁用了 2 个参数。
  • 嗯,不完全是。在 Python 3 中,您只需要使用第一种语法,不带括号。它只是带括号的版本被禁用。
【解决方案2】:

如果你想避免使用数字索引,你可以使用嵌套的 lambda 和 uppacking:

from collections import namedtuple

named_tuple = namedtuple('named_tuple', ['entity', 'grade'])

dict_interested_companies = {
    'Google': named_tuple(entity='http://money.cnn.com/video/technology/2018/02/01/kevin-abosch-i-am-a-coin.cnnmoney/index.html', grade=45),
    'Comcast': named_tuple(entity='http://money.cnn.com/2018/02/02/pf/college/public-service-student-loan-forgiveness/index.html', grade=39)
}

sorted_list = sorted(dict_interested_companies.items(), key=lambda item: (lambda key, value: value.grade)(*item))

print(sorted_list)

输出

[('Comcast', named_tuple(entity='http://money.cnn.com/2018/02/02/pf/college/public-service-student-loan-forgiveness/index.html', grade=39)), ('Google', named_tuple(entity='http://money.cnn.com/video/technology/2018/02/01/kevin-abosch-i-am-a-coin.cnnmoney/index.html', grade=45))]

【讨论】:

    猜你喜欢
    • 2020-10-20
    • 2020-10-19
    • 2016-04-04
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多