gpt4 book ai didi

python - 在 python 中进行对应替换操作的更快方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:17 24 4
gpt4 key购买 nike

我不确定我对此使用了正确的术语——我会称之为合并操作吗?简单匹配?

我有两本字典。其中一个包含标签 ID 列表。另一个是标签ID和标签ID名称之间的对应关系。我想匹配 ID 并在第一个字典中包含标签名称。

所以,第一个字典看起来像这样:

>>> myjson
[
{"tags" : ["1","3"],"otherdata" : "blah"},
{"tags" : ["2","4"],"otherdata" : "blah blah"}
]

第二个字典看起来像这样:

>>> tagnames
[
{"id": "1", "name":"bassoon"},
{"id": "2", "name":"banjo"},
{"id": "3", "name":"paw paw"},
{"id": "4", "name":"foxes"}
]

要用标签 ID 名称替换 myjson 中的标签 ID,我目前正在这样做:

data = []
for j in myjson:
d = j
d['tagnames'] = [i['name'] for i in tagnames for y in d['tags'] if y==i['id']]
data.append(d)

我想要的输出是这样的:

>>> data
[
{"tags" : ["1","3"],"otherdata" : "blah", "tagname" : ["bassoon","paw paw"]},
{"tags" : ["2","4"],"otherdata" : "blah blah", "tagname": ["banjo","foxes"]}
]

我得到了正确的输出,但它似乎真的很慢。我知道它每次都对 myjson 中的每个元素进行完整迭代 x 对标记名中的每个元素进行完整迭代(是 m x n 吗?n x n?),这会很慢,但也许有更聪明的语法或技巧可以加快速度?只遍历数组一次而不是 n 次?

哦,如果有人可以建议一种使用灵活的映射或函数方法而不是外部 forloop 来完成此分配的方法,那就太好了。

最佳答案

您想将标记名列表转换成字典:

tagnames_map = {t['id']: t['name'] for t in tagnames}

现在您可以更快地找到匹配的标记名;您的代码已经进行了就地更改,因此我将其简化为:

for d in myjson:
d['tagnames'] = [tagnames_map[t] for t in tagnames_map.viewkeys() & d['tags']]

dict.viewkeys() method返回 dictionary view object就像一个集合。我们将该集合与您的标签列表相交,产生一系列标签,这些标签都列在 tagnames_map 中。通过这样做,我们不必担心 map 中缺少任何标签。

如果您使用的是 Python 3,那么您只需直接使用 tagnames_map.keys();在 Python 3 中,.keys().values()items() 方法已更改为始终返回字典 View 对象。

如果您想制作一个副本,请使用 d.copy():

data = []
for d in myjson:
d = d.copy()
d['tagnames'] = [tagnames_map[t] for t in tagnames_map.viewkeys() & d['tags']]
data.append(d)

dict.copy()创建浅拷贝;不复制可变值,新字典将只引用相同的值。因为您没有在此处更改值,所以没关系。

针对您的示例输入运行此命令可得出:

>>> pprint(data)
[{'otherdata': 'blah', 'tagnames': ['bassoon', 'paw paw'], 'tags': ['1', '3']},
{'otherdata': 'blah blah',
'tagnames': ['banjo', 'foxes'],
'tags': ['2', '4']}]

关于python - 在 python 中进行对应替换操作的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16484291/

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