寻找朋友。
想法是找到所有和first有关系的朋友(包括1跳关系及多跳关系)。问题是怎么找多跳关系的朋友加到列表里面。看别人的代码,解释。。。
第一个,by***StefanPochmann***
def check_connection(network, first, second):
team = {first}
for _ in network:
for edge in network:
pair = set(edge.split('-'))
if pair & team:
team |= pair
return second in team
精简至极。team保存所有和first有关系的朋友。大循环第一次遍历,找出所有和first有1跳关系的朋友放在team中。 这时team中是first加上所有1跳的朋友。大循环第二次循环,重新遍历所有network中朋友对,如果某对朋友对和team中德元素有交集,就将该对朋友和team求并。得到所有和first以及first的1跳朋友的集合的1跳朋友集合,即所有first2跳以内朋友。以此类推。最坏情况是一条直线的关系,所以大循环必要。很黄很暴力,越往后循环每次做的无用计算就越多。
by github jingyuan4ever
def check_connection(network, first, second):
d = dict()
for i in network:
p1, p2 = i.split('-')
d.setdefault(p1, []).append(p2)
d.setdefault(p2, []).append(p1)
opn = [first]
cls = []
while len(opn):
now = opn.pop()
cls.append(now)
if now == second:
return True
for next in d.setdefault(now, []):
if next not in cls and next not in opn:
opn.append(next)
return False
用到了字典中的setdefault函数,每一个人对应一个key,value中存的是1跳关系的朋友。自己演绎了一下发现正确,个中道理还不是很懂。。自己写怎么想到用cls和opn两个list搞来搞去就成功了。。。