<p>如果列表包装确实是多余的,并且忽略了相应键不在<code>team_ids</code>中的情况,则可以在此处显著减少循环和成员资格测试的数量:</p>
<pre><code>def formoutput(teams_id, patent_team):
"""
The function to compare team_id and patent_teams to form the default dictionary matching values
:param teams_id: {('3879797-2', '3930281-2'): 1, ('3930282-1', '3930282-2'): 2, ('3930288-1', '3930288-2'): 3, ... }
:param patent_team: {3930281: [[('3879797-2', '3930281-2')]], 3930282: [[('3930282-1', '3930282-2')]], 3930288: [[('3930288-1', '3930288-2')]], ... }
:return: defaultdict(<function defaultdict.copy>, {3930281: defaultdict(list, {'3879797-2': [1], '3930281-2': [1]}), 3930282: defaultdict(list, {'3930282-1': [2], '3930282-2': [2]}), 3930288: defaultdict(list, {'3930288-1': [3], '3930288-2': [3]}), 3930292: defaultdict(list, {'3861607-1': [4], '3861607-2': [4]}), ..}
...:
"""
print("Forming Output")
print("Teams id =", teams_id)
print("Patent_team=", patent_team)
# I hate lambdas, and as it happens, we don't need'em;
# defaultdict(list).copy is cleaner and faster
output_dict = defaultdict(defaultdict(list).copy)
try:
# [[pvs]] unpacks the superfluous(?) lists wrapping the tuple we care about
for pk, [[pvs]] in patent_team.items():
# Get the value to set once up front
try:
v = teams_id[pvs]
except KeyError:
continue # Don't have a value to set, so move to next
# Perform the first layer of dict lookup once since the key is the same
# each time to avoid cost of repeated lookup
pkdict = output_dict[pk]
for pv in pvs:
pkdict[pv].append(v)
except Exception as e:
print(e)
return output_dict
</code></pre>
<p>在反向循环中,由于<code>patent_teams</code>键是外部结果<code>defaultdict</code>的键,因此首先循环<code>patent_teams</code>是有意义的,避免对每个<code>patent_teams</code>键重复查找<code>output_dict</code>。这也意味着您可以使用<code>patent_teams</code>中的值直接从<code>teams_id</code>中查找所需内容,而不是通过<code>teams_id</code>进行迭代搜索。你知道吗</p>
<p>如果<code>list</code>包装不是多余的,请替换:</p>
<pre><code>for pk, [[pvs]] in patent_team.items():
</code></pre>
<p>使用:</p>
<pre><code>for pk, pvs_lists in patent_team.items():
for pvs in chain.from_iterable(pvs_lists):
</code></pre>
<p>确保在文件的顶部包含import<code>from itertools import chain</code>。你知道吗</p>