看起来这种关系是对称的,但是你的数据不是(例如没有钥匙'otis'
)。第一部分涉及使其对称,所以我们从哪里开始并不重要。
(如果你的数据实际上是对称的,那么跳过这一部分。)
的Python 2.7
from collections import defaultdict
data = {'dog':['milo','otis','laurel','hardy'],'cat':['bob','joe'],'milo':['otis','laurel','hardy','dog'],'hardy':['dog'],'bob':['joe','cat']}
# create symmetric version of data
d = defaultdict(list)
for key, values in data.iteritems():
for value in values:
d[key].append(value)
d[value].append(key)
visited = set()
def connected(key):
result = []
def connected(key):
if key not in visited:
visited.add(key)
result.append(key)
map(connected, d[key])
connected(key)
return result
print [connected(key) for key in d if key not in visited]
的Python 3。3
from collections import defaultdict
data = {'dog':['milo','otis','laurel','hardy'],'cat':['bob','joe'],'milo':['otis','laurel','hardy','dog'],'hardy':['dog'],'bob':['joe','cat']}
# create symmetric version of data
d = defaultdict(list)
for key, values in data.items():
for value in values:
d[key].append(value)
d[value].append(key)
visited = set()
def connected(key):
visited.add(key)
yield key
for value in d[key]:
if key not in visited:
yield from connected(value)
print([list(connected(key)) for key in d if key not in visited])
结果
[['otis', 'milo', 'laurel', 'dog', 'hardy'], ['cat', 'bob', 'joe']]
性能
O(n)
,其中n
是data
(键和值的总数在您的情况,17,如果我算正常)。
如果你有另外一个关键字,比如说'小狗',并且它的值是'['dog','cat','milo','hardy','bob','乔']'? –
啊,好问题。在我的数据中,这样的例子不存在。小狗可以,但它不会与猫和他们肮脏的同伙。 – Vince