まず、渡されたディクショナリと返されるディクショナリを分離する必要があります。
def build_person_to_matches(d, name):
ret = {}
collect = 0
for books in d[name]:
for person in d.keys():
if books in d[person]:
collect += 1
ret[person] = collect
return ret
d = {
'Tom': ['fiction', 'documentary', 'science'],
'John': ['computer science', 'math'],
'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')
次に、2 つの for ループの順序を入れ替えて、collect = 0
行を最初のループに移動します。
def build_person_to_matches(d, name):
ret = {}
for person in d.keys():
collect = 0
for books in d[name]:
if books in d[person]:
collect += 1
ret[person] = collect
return ret
d = {
'Tom': ['fiction', 'documentary', 'science'],
'John': ['computer science', 'math'],
'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')
必要に応じて、読みやすくするために、内部ループを独自の関数に移動して、何が起こっているのかをより明確にすることもできます。
def how_many_genres_both_people_like(d, person_a, person_b):
total = 0
for books in d[person_a]:
if books in d[person_b]:
total += 1
return total
def build_person_to_matches(d, name):
ret = {}
for person in d.keys():
ret[person] = how_many_genres_both_people_like(d, name, person)
return ret
d = {
'Tom': ['fiction', 'documentary', 'science'],
'John': ['computer science', 'math'],
'Jack': ['science', 'computer science', 'math', 'chemistry']
}
print build_person_to_matches(d, 'Jack')
出力:
{'John': 2, 'Jack': 4, 'Tom': 1}