Если перенос списка действительно лишний и вы игнорируете случаи, когда соответствующий ключ отсутствует в team_ids
, вы можете значительно сократить количество циклов и тестов членства здесь:
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
В инвертированных циклах, поскольку ключи patent_teams
являются ключами внешнего результата defaultdict
, имеет смысл сначала выполнить цикл по patent_teams
, избегая повторных поисков в output_dict
для каждой клавиши patent_teams
. Это также означает, что вы можете использовать значение из patent_teams
, чтобы непосредственно искать то, что вам нужно из teams_id
, вместо того, чтобы перебирать teams_id
для поиска.
Если упаковка list
не лишняя, замените:
for pk, [[pvs]] in patent_team.items():
с:
for pk, pvs_lists in patent_team.items():
for pvs in chain.from_iterable(pvs_lists):
обязательно включите импорт from itertools import chain
вверху файла.