Python3中的Lambda排序问题

时间:2018-01-12 06:39:53

标签: python python-3.x sorting lambda

我的python2.7代码包含lambda排序技术,用于根据定义的顺序对获取的元素进行排序。昨天我从python 2.7迁移到python 3.6,问题是在迁移之后我编写lambda sort的行是在程序中抛出错误。对于从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'

2 个答案:

答案 0 :(得分:2)

在Python 2中,可以在lambda / function参数中解包(k, v)元组,但是not in Python 3。你可以解压缩lambda内联,

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)

答案 1 :(得分:1)

你需要将key=lambda k, v: property_sort_order.index(k)变成key=lambda k_v:property_sort_order.index(k_v[0]) - lambda传递给一个元组,你不能在python3.6中进行解构。