【发布时间】:2021-01-29 10:58:08
【问题描述】:
我有一本字典,其中所有的 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)
【问题讨论】:
-
lambda x: tuple(map(int, x.values()))? -
如果 Python 支持函数组合,
itemgetter在这种情况下会好很多,例如sorted(l_dictt, key=int∘itemgetter("id_macrocateg"))。 IMO 运营商确实需要获得全部利益;key=compose(int, itemgetter("id_macrocateg"))似乎还是太冗长了。 -
@SayanipDutta 假设(在这种情况下是安全的,但不是一般情况下)
dict中的每个值可以 转换为int,不管有没有必要。进行大量不必要的int调用也可能代价高昂。 -
但最重要的是,它在
id_macrocateg之前排序id_categ。 -
或者对于多列,
key=partial(map, int)∘itemgetter("id_macrocateg", "id_categ", "id_microcateg")。
标签: python dictionary lambda