首页 > 解决方案 > 将 cmp 转换为 python 3

问题描述

我正在尝试将 python 2 函数转换为 python 3。问题是它在排序时使用 cmp 关键字。我知道我可以通过使用functools.cmp_to_key来解决这个问题,看起来像key=functools.cmp_to_key(agency_label_cmp)。但是,我的函数使用 cmp 和 'key' 关键字:

results = sorted(results.items(), cmp=agency_label_cmp, key=operator.itemgetter(0))

所以我不明白如何转换它以使其与 python 3 兼容。这是完整的代码:

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

标签: python

解决方案


您可以从删除key参数开始。

results = sorted(results.items(), cmp=agency_label_cmp, key=operator.itemgetter(0))

是相同的

results = sorted(results.items(), cmp=lambda x, y: agency_label_cmp(x[0], y[0]))

因为这operator.itemgetter(0)只是映射列表或等效于 0 处元素的一种奇特方式。

然后您可以将其放入转换中:

results = sorted(results.items(), 
                 key=functools.cmp_to_key(lambda x, y: agency_label_cmp(x[0], y[0])))

推荐阅读