字典中的潜力列表

时间:2017-11-20 05:45:32

标签: python list dictionary

我有以下列表,我正在尝试创建一个潜在朋友列表,这基本上意味着每个人目前都不是该人的朋友。

字典中的键是人物,值列表是他们的朋友。

person_to_friends = {'Jay Pritchett': ['Claire Dunphy', 'Gloria 
Pritchett', 'Manny Delgado'], 'Claire Dunphy': ['Jay Pritchett', 
'Mitchell Pritchett', 'Phil Dunphy'], 'Manny Delgado': ['Gloria 
Pritchett', 'Jay Pritchett', 'Luke Dunphy'], 'Mitchell Pritchett': 
['Cameron Tucker', 'Claire Dunphy', 'Luke Dunphy'], 'Alex Dunphy': 
['Luke Dunphy'], 'Cameron Tucker': ['Gloria Pritchett', 'Mitchell 
Pritchett'], 'Haley Gwendolyn Dunphy': ['Dylan D-Money', 'Gilbert D-
Cat'], 'Phil Dunphy': ['Claire Dunphy', 'Luke Dunphy'], 'Dylan D-
Money': ['Chairman D-Cat', 'Haley Gwendolyn Dunphy'], 'Gloria 
Pritchett': ['Cameron Tucker', 'Jay Pritchett', 'Manny Delgado'], 'Luke 
Dunphy': ['Alex Dunphy', 'Manny Delgado', 'Mitchell Pritchett', 'Phil 
Dunphy']}

这是我到目前为止的代码,我不知道如何更新我的潜在朋友列表。

def friends_score(person, person_to_friends):
    score = 0
    potential_friends = []
    for item in person_to_friends:
        if item == person:
           potential_friends = #this is where I am unsure as to how to proceed

仅供参考,潜在朋友的定义是此人目前不是朋友的任何人。例如,如果Jay Pritchett是这个人,那么潜在的朋友将是除了价值列表中的人之外的所有人:['Claire Dunphy','Gloria     Pritchett','Manny Delgado']

预期结果

>>> friends_score('Jay Pritchett')

['Mitchell Pritchett', 'Phil Dunphy', 'Luke Dunphy', 'Cameron 
   Tucker', 'Alex Dunphy','Haley Gwendolyn Dunphy','Dylan D-Money', 
   'Gilbert D-Cat','Chairman D-Cat']

3 个答案:

答案 0 :(得分:1)

您可以使用以下comprehension

def friends_score(person, person_to_friends):
    # ...
    potential_friends = [
        p for p in person_to_friends if p != person and p not in person_to_friends.get(person, [])
    ]
    # ...

收集dict中不在指定人员的朋友列表中且不是他自己的所有键。这大致等同于以下内容:

def friends_score(person, person_to_friends):
    # ...
    friends = person_to_friends.get(person, [])
    # for larger data sets, you might want to convert the friends to a set
    # friends = set(friends)
    potential_friends = []
    for p in person_to_friends:
        if p != person and p not in friends:
            potential_friends.append(p)
    # ...

答案 1 :(得分:0)

如果所有潜在的朋友都是字典中的键,您也可以使用集合

def friends_score(person, person_to_friends):
    s_fr = set(person_to_friends[person])
    s_fr.add(person)
    s_all = set(person_to_friends.keys())
    return list(s_all.difference(s_fr))

output = friends_score('Jay Pritchett', person_to_friends)

s_fr是有问题的人和他们的朋友的集合。 s_all是字典中键的所有人的列表。最终列表来自两组之间的差异。

如果您还需要考虑仅包含在字典值中的人员,同样的解决方案将无法避免列表理解和使用zip压缩列表。在那种情况下,@ schwobaseggl解决方案对我来说似乎更好。

答案 2 :(得分:0)

  

您可以使用set:

在函数内的一行中完成工作
return list(set([i for i in person_to_friends])-set(person_to_friends.get(person)))

完整代码:

def friends_score(person, person_to_friends):
    return list(set([i for i in person_to_friends])-set(person_to_friends.get(person)))

print(friends_score('Jay Pritchett',person_to_friends))

输出:

['Dylan D-Money', 'Phil Dunphy', 'Cameron Tucker', 'Luke Dunphy', 'Mitchell Pritchett', 'Alex Dunphy', 'Jay Pritchett', 'Haley Gwendolyn Dunphy']