将cmp转换为python 3

将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兼容。以下是

我正在尝试将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兼容。以下是完整的代码:

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])))