gpt4 book ai didi

python - 如何根据列表中的部分键重新排列有序字典

转载 作者:太空狗 更新时间:2023-10-29 21:06:21 25 4
gpt4 key购买 nike

我正在根据列表中的键重新排列一些有序字典。例如:

old_OD = OrderedDict([('cat_1',1), 
('dog_1',2),
('cat_2',3),
('fish_1',4),
('dog_2',5)])

现在我有一个组的订单列表。

order = ['dog', 'cat', 'fish']

然后将字典中的项目组合在一起得到结果,如下所示:

new_OD = OrderedDict([('dog_1',2),
('dog_2',5),
('cat_1',1),
('cat_2',3),
('fish_1',4)])

我发现了一些很好的相关问题 How to reorder OD based on listRe-ordering OrderedDict我将在第二个链接中使用解决方案

new_od = OrderedDict([(k, None) for k in order if k in old_od])
new_od.update(old_od)

现在,在我的例子中,“k”不是 new_od 的精确匹配和所需的键值,我应该如何修改以构建新的 od?

编辑:如果没有下划线标记关键字的位置,会发生什么情况,比如我们有“Big_cat_3”或“dog_black_2”?关键字可以在字符串中的任何位置。一旦 key 组合在一起,就不需要字母数字顺序。

最佳答案

在这里,我将分享两种解决方案。

<强>1。对于具有相同前缀的键,保持初始 OrderedDict

的顺序

在这里,我使用列表理解 来迭代order 列表和OrderDict。基于比较,我们正在传递具有创建 OrderedDict 对象所需顺序的元组列表:

>>> from collections import OrderedDict
>>> old_OD = OrderedDict([('cat_1',1),
... ('dog_1',2),
... ('cat_2',3),
... ('fish_1',4),
... ('dog_2',5)])
>>> order = ['dog', 'cat', 'fish']

>>> new_OD = OrderedDict([(k,v) for o in order for k, v in old_OD.items() if k.startswith(o+'_')])
# to match the prefix pattern of <key> + "_" ^

new_OD 的位置:

OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])

<强>2。对于具有相同前缀的 key ,执行 lexicographical元素排序

我们可以修改上述解决方案,使用 sorteditertools.chain 嵌套 list comprehension 来实现这一点:

>>> from itertools import chain

>>> new_OD = OrderedDict(chain(*[sorted([(k,v) for k, v in old_OD.items() if k.startswith(o+'_')]) for o in order]))

new_OD 的位置:

OrderedDict([('dog_1', 2), ('dog_2', 5), ('cat_1', 1), ('cat_2', 3), ('fish_1', 4)])

关于python - 如何根据列表中的部分键重新排列有序字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55365671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com