在 Python 中加入两个 defaultdict
Join two defaultdicts in Python
我分析了一个巨大的书目记录数据库(大约 2000 万条记录)。每条记录都有唯一的 ID 字段、一组作者和一组描述书目记录主要内容的 term/keywords。例如,典型的书目记录如下所示:
ID: 001
Author: author1
Author: author2
Term: term1
Term: term2
首先,我创建两个 defaultdict
s 来存储作者和术语:
d1 = defaultdict(lambda : defaultdict(list))
d2 = defaultdict(lambda : defaultdict(list))
接下来,我填充作者:
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
我有两个问题:
- 提议的方法是否合适,或者我应该 store/represent 以其他方式获取数据?
- 能否请您大致建议一下如何加入这两个词典?
这些问题的关键是从现有的词典中构建临时词典"properly oriented"。一旦完成,它就更清楚了(而且由于适当的字典查找,复杂性很好)
这是我的解决方案:
首先创建一个 dict author => ids from d1
.
然后创建结果(a 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
结果:
{'author4': ['id003'], 'author3': ['id002'], 'author1': ['id001', 'id003'], 'author2': ['id001']}
{'author3': ['term2', 'term3'], 'author4': ['term4'], 'author1': ['term1', 'term2', 'term4'], 'author2': ['term1', 'term2']}
这是一种方式。请注意,如下所示,您不需要在初始步骤中使用嵌套字典或 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']}
我分析了一个巨大的书目记录数据库(大约 2000 万条记录)。每条记录都有唯一的 ID 字段、一组作者和一组描述书目记录主要内容的 term/keywords。例如,典型的书目记录如下所示:
ID: 001
Author: author1
Author: author2
Term: term1
Term: term2
首先,我创建两个 defaultdict
s 来存储作者和术语:
d1 = defaultdict(lambda : defaultdict(list))
d2 = defaultdict(lambda : defaultdict(list))
接下来,我填充作者:
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
我有两个问题:
- 提议的方法是否合适,或者我应该 store/represent 以其他方式获取数据?
- 能否请您大致建议一下如何加入这两个词典?
这些问题的关键是从现有的词典中构建临时词典"properly oriented"。一旦完成,它就更清楚了(而且由于适当的字典查找,复杂性很好)
这是我的解决方案:
首先创建一个 dict author => ids from d1
.
然后创建结果(a 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
结果:
{'author4': ['id003'], 'author3': ['id002'], 'author1': ['id001', 'id003'], 'author2': ['id001']}
{'author3': ['term2', 'term3'], 'author4': ['term4'], 'author1': ['term1', 'term2', 'term4'], 'author2': ['term1', 'term2']}
这是一种方式。请注意,如下所示,您不需要在初始步骤中使用嵌套字典或 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']}