python - 有没有办法在使用 itemgetter 或 lambda 在 python 中排序时从字符串转换为整数?
问题描述
我有一本字典,其中所有 id 为字符串(id_categ、id_macrocateg、id_microcateg)。我不想迭代所有 dict 以将它们转换为整数并在对它们进行排序之后。我想知道在排序时是否有使用 itemgetter 或 lambda 将所有 id 转换为 int 的方法。
字典列表的示例可能是这样的(实际上,列表可以动态更改):
l_dictt = [
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '1'},
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '111'},
{'id_categ': '14', 'id_macrocateg': '1', 'id_microcateg': '35'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '9'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '19'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '26'},
{'id_categ': '2', 'id_macrocateg': '50', 'id_microcateg': '554'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '4'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '16'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '17'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '20'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '21'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '24'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '31'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '11'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '12'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '13'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '10'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '27'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '28'},
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'},
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'}]
我想要的输出是:
l_dictt = [
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '1'},
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '111'},
{'id_categ': '14', 'id_macrocateg': '1', 'id_microcateg': '35'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '9'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '19'},
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '26'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '4'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '16'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '17'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '20'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '21'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '24'},
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '31'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '11'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '12'},
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '13'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '10'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '27'},
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '28'},
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'},
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'},
{'id_categ': '2', 'id_macrocateg': '50', 'id_microcateg': '554'}]
如果这 3 个键是整数,因为我想先按 id_macrocateg 排序,然后按 id_categ 和最后 id_microcateg,我可以这样做:
for dictt in sorted(l_dictt, key=itemgetter('id_macrocateg', 'id_categ', 'id_microcateg'):
print(dictt)
但由于是字符串,我不能这样做。
我努力了:
from operator import itemgetter
for dictt in sorted(l_dictt, key=lambda x: int(itemgetter("id_macrocateg, id_categ, id_microcateg")(x))):
print(dictt)
还有这个:
from operator import itemgetter
for dictt in sorted(l_dictt, key=lambda x: int(itemgetter("id_macrocateg")(x)),int(itemgetter("id_categ")(x))),int(itemgetter(("id_microcateg")(x))):
print(dictt)
解决方案
更新问题后回答:
现在,您希望根据 id_macrocateg、id_categ 和 id_microcateg 对列表进行排序,因此我们通过以下方式获得它:
sorted(l_dictt, key=lambda x: x['id_macrocateg'].zfill(10)+x['id_categ'].zfill(10)+x['id_microcateg'].zfill(10))
这里我假设最大位数可以是 10 位 '9999999999',如果需要,我们当然可以更新。
结果
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '1'}
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '111'}
{'id_categ': '14', 'id_macrocateg': '1', 'id_microcateg': '35'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '9'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '19'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '26'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '4'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '16'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '17'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '20'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '21'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '24'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '31'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '11'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '12'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '13'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '10'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '27'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '28'}
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'}
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'}
{'id_categ': '2', 'id_macrocateg': '50', 'id_microcateg': '554'}
更新问题之前的初步答案:
您可以按 的值对该字典进行排序,id_categ
同时保持其值不变,如下所示:
for dictt in sorted(l_dictt, key=lambda x: int(x['id_categ'])):
print(dictt)
结果
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '1'}
{'id_categ': '1', 'id_macrocateg': '1', 'id_microcateg': '111'}
{'id_categ': '2', 'id_macrocateg': '50', 'id_microcateg': '554'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '11'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '12'}
{'id_categ': '10', 'id_macrocateg': '2', 'id_microcateg': '13'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '10'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '27'}
{'id_categ': '12', 'id_macrocateg': '2', 'id_microcateg': '28'}
{'id_categ': '14', 'id_macrocateg': '1', 'id_microcateg': '35'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '9'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '19'}
{'id_categ': '19', 'id_macrocateg': '1', 'id_microcateg': '26'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '4'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '16'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '17'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '20'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '21'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '24'}
{'id_categ': '21', 'id_macrocateg': '1', 'id_microcateg': '31'}
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'}
{'id_categ': '30', 'id_macrocateg': '6', 'id_microcateg': '112'}
推荐阅读
- javascript - 在 Autodesk Forge 中删除特定的 3D threeJS 对象
- excel - 当源在一个位置时,SSIS 在同一位置失败,但在另一个位置时不会
- javascript - 将自定义字段添加到 Bootstrap Datepicker
- airflow - Airflow 2.1.0 使用 TriggerDagRunOperator 将变量传递给另一个 DAG
- node.js - 'shopify node serve' 启动开发环境 - 错误(Shopify CLI)
- angular - 如何以反应形式为未声明的控件赋值?
- javascript - WooCommerce Hooks - 如果选中复选框,则为必填字段
- php - 在带有 if 语句的 php 函数中使用 return
- blazor - Blazor 初始化对象的最佳实践
- sql - 在 Oracle 中选择并更新日期为 00/00/0000 00:00:00 00 的行