以下の関数 (この場合はメソッド) は、反復中にリストを変更するため、役に立たないと誰かが言いました。意図したとおりに機能するのはなぜですか。私は実際にそれに非常に満足していました.それを書くより良い方法はありますか.
データ構造、機能、および出力は次のとおりです。
nodes = { ('foo','bar',1),
('foo','baz',1),
('baz','gad',0),
('boo','moo',1),
('goo','loo',0),
('bar','far',1),
('far','aaa',0) }
class Graph(dict):
def __missing__(self, key):
self[key] = set()
return self[key]
def add_node_pairs(self, node_pairs):
for pair in node_pairs:
nodeA, nodeB, weight = pair
self[nodeA].add((weight, nodeB))
self[nodeB].add((weight, nodeA))
def find_paths(self, keys):
paths = [(key,) for key in keys if key in self]
for path in paths:
*oldkeys, key = path
for weight, next_key in self[key]:
if next_key not in oldkeys:
paths.append( path + (weight,next_key) )
paths.sort()
return paths
graph = Graph()
graph.add_node_pairs(nodes)
print(graph)
print( graph.find_paths(['foo']))
グラフ:
{ 'goo': {(0, 'loo')},
'foo': {(1, 'bar'), (1, 'baz')},
'aaa': {(0, 'far')},
'far': {(1, 'bar'), (0, 'aaa')},
'baz': {(0, 'gad'), (1, 'foo')},
'loo': {(0, 'goo')},
'moo': {(1, 'boo')},
'boo': {(1, 'moo')},
'bar': {(1, 'far'), (1, 'foo')},
'gad': {(0, 'baz')} }
find_paths ('foo'):
[ ('foo',),
('foo', 1, 'bar'),
('foo', 1, 'bar', 1, 'far'),
('foo', 1, 'bar', 1, 'far', 0, 'aaa'),
('foo', 1, 'baz'),
('foo', 1, 'baz', 0, 'gad') ]