在Python中连接两个defaultdict

2024-06-16 14:47:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我分析了一个庞大的书目记录数据库(大约2000万条记录)。著录者描述了每一个著录字段的一组唯一的关键字和记录。例如,典型的书目记录如下:

ID: 001
Author: author1
Author: author2
Term: term1
Term: term2

首先,我创建两个defaultdict来存储作者和术语:

^{pr2}$

接下来,我填充作者:

d1['id001'] = ['author1', 'author2'] 
d1['id002'] = ['author3'] 
d1['id003'] = ['author1', 'author4'] 

和关键字:

d2['id001'] = ['term1', 'term2']  
d2['id002'] = ['term2', 'term3']
d2['id003'] = ['term4']

问题是如何将这两个字典连接起来,以获取直接链接作者和术语的数据对象:

author1|term1,term2,term4
author2|term1,term2
author3|term2,term3
author4|term4

我有两个问题:

  • 建议的方法是否合适,或者我应该以其他方式存储/表示数据?在
  • 你能大致建议一下如何把这两本词典合并起来吗?在

Tags: term1记录作者关键字authord2d1术语
2条回答

这是一种方法。注意,如下所示,您不需要在初始步骤中使用嵌套字典或defaultdict。在

from collections import defaultdict

d1 = {}
d2 = {}

d1['id001'] = ['author1', 'author2'] 
d1['id002'] = ['author3'] 
d1['id003'] = ['author1', 'author4'] 

d2['id001'] = ['term1', 'term2']  
d2['id002'] = ['term2', 'term3']
d2['id003'] = ['term4']

res = defaultdict(list)

for ids in set(d1) & set(d2):
    for v in d1[ids]:
        res[v].extend(d2[ids])

res = {k: sorted(v) for k, v in res.items()}

# {'author1': ['term1', 'term2', 'term4'],
#  'author2': ['term1', 'term2'],
#  'author3': ['term2', 'term3'],
#  'author4': ['term4']}

这些问题的关键是如何在现有词典的基础上,建立“适当导向”的临时词典。一旦这样做了,它就更清晰了(由于正确的dict查找,复杂性是很好的)

我的解决方案是:

首先从d1创建dict author=>;ids。在

然后创建结果(dict author=>;terms)。在已创建的author=>;ids dict中循环,并用d2的展平值填充结果。在

d1=dict()
d2=dict()

d1['id001'] = ['author1', 'author2']
d1['id002'] = ['author3']
d1['id003'] = ['author1', 'author4']

d2['id001'] = ['term1', 'term2']
d2['id002'] = ['term2', 'term3']
d2['id003'] = ['term4']

import collections

authors_id = collections.defaultdict(list)
for k,v in d1.items():
    for a in v:
        authors_id[a].append(k)

print(dict(authors_id)) # convert to dict for clearer printing


authors_term = collections.defaultdict(list)
for k,v in authors_id.items():
    for a in v:
        for i in d2[a]:
            authors_term[k].append(i)

print(dict(authors_term)) # convert to dict for clearer printing

结果:

^{pr2}$

相关问题 更多 >