【问题标题】:Lambda sorting issue in Python3Python3 中的 Lambda 排序问题
【发布时间】:2018-01-12 06:39:53
【问题描述】:

我的 python2.7 代码包含 lambda 排序技术,可根据定义的顺序对获取的元素进行排序。昨天我从 python 2.7 迁移到 python 3.6,问题是迁移后我写 lambda 排序的行在程序中抛出错误。对于从 py2 到 py3 的迁移,我使用了 lib2to3。我相信这是 py3 中某些语法不匹配的原因,但无法弄清楚。错误日志如下-

My code Fragment:


 property_sort_order = ['field', 'rename', 'selected', 'description']
        node_property_value_list = []
        node_property_value_list = node_property_value[nodekey]
        node_property_value_list = [OrderedDict(
             sorted(item.iteritems(), key=lambda (k, v): property_sort_order.index(k)))
                                for item in node_property_value_list]
                                    for item in node_property_value_list]
        #print node_property_value_list
        node_property_value[nodekey] = node_property_value_list

Errror:
        for item in node_property_value_list]
    TypeError: <lambda>() missing 1 required positional argument: 'v'

【问题讨论】:

    标签: python python-3.x sorting lambda


    【解决方案1】:

    在 Python 2 中,可以在 lambda/函数参数中解压缩 (k, v) 元组,但 not in Python 3。您可以解压 lambda inline,

    lambda item: property_sort_order.index(item[0])
    

    或解压缩为单独的语句(不能在 lambda 中完成)。

    def sort_key(item):
        k, v = item
        return property_sort_order.index(k)
    sorted(..., key=sort_key)
    

    【讨论】:

    • 它没有帮助@ephemient你能澄清这个答案吗
    【解决方案2】:

    您需要将 key=lambda k, v: property_sort_order.index(k) 转换为 key=lambda k_v:property_sort_order.index(k_v[0]) - lambda 正在传递单个元组,您无法在 python3.6 中对其进行解构。

    【讨论】:

    • 它没有发生@Nathan Vērzemnieks
    • 抱歉,不确定您需要什么。我准确地写了要替换的字符串以及如何替换。究竟什么是“没有发生”?你得到不同的错误吗?
    • sry 先生 @Nathan Vērzemnieks。我错了。你的回答很有帮助,tq
    • 没问题!很高兴解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多