首页 > 解决方案 > 有没有办法在使用 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)

标签: pythondictionarylambda

解决方案


更新问题后回答:

现在,您希望根据 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'}

推荐阅读