我有一个字典,所有id作为字符串(id_categ, id_macrocateg, id_microcateg)。我不想迭代所有的字典把它们转换成整数,然后再排序。我想知道是否有一种方法与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)
但是因为它们是字符串,所以我不能这样做。
I have try:
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)
您的第三次尝试只是缺少一些括号,以确保对int
的所有三个调用都是lambda
表达式体的一部分。
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)
尽管itemgetter
确实在这里碍手碍脚
for dictt in sorted(l_dictt, key=lambda x: (int(l_dictt["id_macrocateg"]),
int(l_dictt["id_categ"]),
int(l_dictt["id_microcateg"]):
print(dictt)
您可以使用map
和itemgetter
,类似于您的第二次尝试:
from operator import itemgetter
# Splitting up for readability
getter = itemgetter("id_macrocateg", "id_categ", "id_microcateg")
for dictt in sorted(l_dictt, key=lambda x: tuple(map(int, getter(x))):
print(dictt)
不过,带有键列表的生成器表达式可能更简单:
keys = ("id_macrocateg", "id_categ", "id_microcateg")
for dictt in sorted(l_dictt, key=lambda x: [int(x[k]) for k in keys]):
(使用列表只是因为没有元组解析;列表和元组以相同的方式排序。)
更新问题后的答案:
现在,您希望列表按照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'}