将cmp转换为python 3
我正在尝试将Python2函数转换为Python3。问题是它在排序时使用了cmp关键字。我知道我可以通过使用解决这个问题,它看起来像将cmp转换为python 3,python,Python,我正在尝试将Python2函数转换为Python3。问题是它在排序时使用了cmp关键字。我知道我可以通过使用解决这个问题,它看起来像key=functools.cmp\u to\u key(agency\u label\u cmp)。但是,我的函数使用cmp和“键”关键字: results = sorted(results.items(), cmp=agency_label_cmp, key=operator.itemgetter(0)) 所以我不明白如何将其转换为与Python3兼容。以下是
key=functools.cmp\u to\u key(agency\u label\u cmp)
。但是,我的函数使用cmp和“键”关键字:
results = sorted(results.items(), cmp=agency_label_cmp, key=operator.itemgetter(0))
所以我不明白如何将其转换为与Python3兼容。以下是完整的代码:
def build_salary_results(agency_type):
def agency_label_cmp(a, b):
"""
Key that uses `agency_type_lookup` order to determine how
everything is presented on the page.
"""
L = map(operator.itemgetter(1), agency_type_lookup)
return (L.index(a) > L.index(b)) -(L.index(a) < L.index(b))
results = defaultdict(lambda: dict(agencies=[], navletters=set()))
navlinks = set()
if agency_type in special:
it = Jurisdiction.objects.filter(kind=agency_type).order_by('name').iterator()
else:
it = Jurisdiction.objects.exclude(kind__in=special).order_by('name').iterator()
for obj in it:
if agency_type in special:
label = obj.category
else:
label = dict(agency_type_lookup).get(obj.kind)
if agency_type == 'SP' and not include_special_district(label):
continue
available_years = obj.available_years()
if agency_type in special and not available_years:
continue
results[label]['agencies'].append((obj, available_years))
results[label]['navletters'].add(obj.name[0].upper())
navlinks.add(label)
if agency_type in special:
results = sorted(results.items(), key=operator.itemgetter(0))
navlinks = sorted(navlinks)
else:
results = sorted(results.items(), cmp=agency_label_cmp, key=operator.itemgetter(0))
navlinks = sorted(navlinks, cmp=agency_label_cmp)
return navlinks, results
def生成工资结果(机构类型):
def机构标签cmp(a、b):
"""
使用“代理类型查找”顺序确定如何查找的键
所有内容都显示在页面上。
"""
L=map(运算符.itemgetter(1),机构类型查找)
收益率(指数(a)>指数(b)-(指数(a)<指数(b))
结果=defaultdict(lambda:dict(agencies=[],navletters=set())
navlinks=set()
如果您输入了特殊信息:
它=辖区。对象。过滤器(种类=机构类型)。按('name')排序。迭代器()
其他:
它=辖区.objects.exclude(kind\uu in=special).order\u by('name').iterator()
对于其中的obj:
如果您输入了特殊信息:
标签=对象类别
其他:
label=dict(代理类型查找).get(对象种类)
如果机构类型=SP且不包括特殊地区(标签):
持续
可用年数=目标可用年数()
如果机构类型为特殊且不可用的年份:
持续
结果[标签][机构].附加((obj,有效年数))
结果[label]['navletters'].add(obj.name[0].upper())
添加(标签)
如果您输入了特殊信息:
结果=已排序(results.items(),key=operator.itemgetter(0))
导航链接=已排序(导航链接)
其他:
结果=已排序(results.items(),cmp=agency\u label\u cmp,key=operator.itemgetter(0))
导航链接=已排序(导航链接,cmp=机构\标签\ cmp)
返回导航链接、结果
您可以先删除键
参数
这个
与
results = sorted(results.items(), cmp=lambda x, y: agency_label_cmp(x[0], y[0]))
因为操作符.itemgetter(0)
只是将列表或等效项映射到0处元素的一种奇特方式
然后您可以将其放入转换中:
results = sorted(results.items(),
key=functools.cmp_to_key(lambda x, y: agency_label_cmp(x[0], y[0])))
你有错误吗?使用
operator.itemgetter(0)
内部函数agency\u label\u cmp
为什么要同时使用key
和cmp
作为开始?这是必须手动操作的吗。如果不是这样,您可以尝试2to3包。它是将Python2代码转换为Python3的官方工具。
results = sorted(results.items(),
key=functools.cmp_to_key(lambda x, y: agency_label_cmp(x[0], y[0])))