我正在尝试将python2函数转换为python3,问题是排序时使用了cmp关键字。我知道我可以通过使用类似于key=functools.cmp_to_key(agency_label_cmp)
的functools.cmp_to_key来解决这个问题。但是,我的函数使用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
发布于 2020-01-02 03:34:39
您可以从删除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])))
https://stackoverflow.com/questions/59557958
复制相似问题