我有以下列表,我正在尝试创建一个潜在朋友列表,这基本上意味着每个人目前都不是该人的朋友。
字典中的键是人物,值列表是他们的朋友。
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']
答案 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']