python - 将 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
解决方案
您可以从删除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])))
推荐阅读
- networking - 无法访问 wifi 路由器管理门户
- python - 使用 Pandas 将 SAS 转换为 Python
- php - Laravel 推送器未在 Localhost 中进行身份验证,但在 Development Server 中进行了身份验证
- css - 添加具有背景 CSS 属性的视频
- sql - SYS_REFCURSOR 作为函数中的输出参数
- excel - Excel 列表中的部分搜索列并填充相邻单元格
- godot - Godot GDScript“参数太多”错误
- python - opencv - 如何检查轮廓位置
- google-identity - 谷歌身份服务实现手动和自动退出功能
- sql - 达到值后限制查询结果