擅长:python、mysql、java
<p>由于这是一个图形问题,正如Christian Sloper所提到的,您也可以使用networkx:</p>
<pre class="lang-py prettyprint-override"><code>import networkx as nx
ls = [[0, 'C', [1, 2, 3, 4], 'E', []],
[1, 'C', [0, 5, 6, 7], 'E', []],
[2, 'H', [0], '-', []],
[3, 'H', [0], '-', []],
[4, 'H', [0], '-', []],
[5, 'H', [1], '-', []],
[6, 'O', [1], 'X', []],
[7, 'H', [1], '-', []]]
# identify atom marked as X
x_index = next(filter(lambda x: x[3] == "X", ls))[0]
G = nx.Graph()
G.add_nodes_from([atom[0] for atom in ls])
G.add_edges_from(set((a1[0], a2) for a1 in ls for a2 in a1[2]))
map_atom_dist = nx.single_source_shortest_path_length(G, x_index)
# map_atom_dist: {6: 0, 1: 1, 0: 2, 5: 2, 7: 2, 2: 3, 3: 3, 4: 3}
[atom[:-1] + [map_atom_dist[atom[0]]] for atom in ls]
# Output:
[[0, 'C', [1, 2, 3, 4], 'E', 2],
[1, 'C', [0, 5, 6, 7], 'E', 1],
[2, 'H', [0], '-', 3],
[3, 'H', [0], '-', 3],
[4, 'H', [0], '-', 3],
[5, 'H', [1], '-', 2],
[6, 'O', [1], 'X', 0],
[7, 'H', [1], '-', 2]]
</code></pre>