比较字典中的值

时间:2014-03-23 00:59:38

标签: python dictionary

使用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

这似乎不正确。但如果有人能给我提示/提示让我走上正确的方向,那将非常感激!

提前谢谢你:)

3 个答案:

答案 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想要的......