我的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'
答案 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中进行解构。