使用Python 3.3
嗨,我是编程/ Python的新手,所以请不要深入/复杂地解决这个问题。
我有一个字典,其中的键是人的姓名,每个键的值都是该人朋友姓名的列表。例如:
friends_of_person = {'Albus': ['Ron', 'Hermione'], 'Harry': ['Ron', 'Hermione', 'Neville']}
这本字典可以更长。
我的问题是,我如何编写一个for循环或代码来循环遍历这些值,并将每个值与另一个键值的每个值进行比较。为了更清楚,让我们使用上面的例子。 Albus是Harry,Ron和Hermione的朋友。哈利是罗恩和赫敏的朋友。
但是我想把'Ron'与来自关键Harry的'Ron','Hermione'和'Neville'进行比较。 然后我想要的是看看'Ron'是否是Harry的朋友。如果罗恩是哈利的朋友,那么我想让'哈利'成为'阿不思'的潜在朋友。这个案例适用于将哈利的价值观中的'赫敏'与'罗恩'和'赫敏'进行比较。 - 这就像共同的朋友。
以下是我编写的代码,但它似乎没有得到正确答案。
friends_of_person = {'Albus': ['Ron', 'Hermione'], 'Harry': ['Ron', 'Hermione', 'Neville']}
for person in friends_of_person:
friends_list = friends_of_person[person]
for friend in friends_list:
recommendation = ''
for another_person in friends_of_person:
if friend in friends_of_person[another_person]:
recommendation = another_person
这似乎不正确。但如果有人能给我提示/提示让我走上正确的方向,那将非常感激!
提前谢谢你:)
答案 0 :(得分:0)
使用set
检查人物朋友列表的交叉点:
In [352]: lst1=friends_of_person['Albus']
In [353]: lst2=friends_of_person['Harry']
In [354]: lst1
Out[354]: ['Ron', 'Hermione']
In [355]: lst2
Out[355]: ['Ron', 'Hermione', 'Neville']
In [356]: set(lst1)&set(lst2)
Out[356]: set(['Hermione', 'Ron'])
答案 1 :(得分:0)
@ zhangxaochen使用套装的答案在我看来是最好的。尽管如此,如果您想使用列表,您可以执行以下操作:
friends = {'Albus': ['Ron', 'Hermione'], 'Harry': ['Ron', 'Hermione', 'Neville']}
def mutual_friends(a, b):
return [x for x in friends[a] if x in friends[b]]
请注意,重新编码设置交集(编辑:如果您已被指示不使用集合交集,则此解决方案很好,因为您自己编写代码:)。)。
所以
def recommendations(x):
result = []
for f in friends.keys():
if f != x and mutual_friends(x, f) > 1:
result.append(f)
return result
基本上,对于某个人x
,找到与他们有多个共同朋友的所有人。如果您只想要2个共同的朋友,可以将其更改为== 2
。
答案 2 :(得分:0)
如果您只想使用简单的迭代和基本功能,请转到:
for friend in friends_of_person['Albus']:
recommendation = []
for person, friends in friends_of_person.items():
if person == 'Albus':
continue # we don't need anyone who already is his friend
for potential in friends:
if potential in friends_of_person['Albus'] and potential not in recommendation:
recommendation.append(potential)
print(potential)
...:
Neville
PS。这很丑陋,但这就是OP想要的......