【发布时间】:2021-05-22 09:39:54
【问题描述】:
我有这个清单:
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], '-', []]]
这代表一个分子。第一列只是一个数字,第二列是分子中的一个原子,第三列告诉这个原子与哪些原子结合。例如,原子 0 与原子 1、2、3 和 4 绑定。我想找出每个原子离氧的距离,这是信息存储到最后一列。所以输出应该是:
[[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]]
我试过这个循环,它工作得很好:
def dists(data):
new_data = data
# Loop to find the distances from the X-atom:
for sl2 in new_data:
if sl2[3] == "X":
sl2[4] = 0
next1 = sl2[2]
for number1, row1 in enumerate(new_data):
for a1 in next1:
if new_data[number1][0] == a1:
if type(new_data[a1][4]) == list:
new_data[a1][4] = 1
next2 = new_data[a1][2]
for number2, row2 in enumerate(new_data):
for a2 in next2:
if new_data[number2][0] == a2:
if type(new_data[a2][4]) == list:
new_data[a2][4] = 2
next3 = new_data[a2][2]
for number3, row3 in enumerate(new_data):
for a3 in next3:
if new_data[number3][0] == a3:
if type(new_data[a3][4]) == list:
new_data[a3][4] = 3
next4 = new_data[a3][2]
#etc...
return new_data
ls2 = dists(ls)
但现在我必须制作许多嵌套的 for 循环。如何将这些嵌套循环变成一个循环?
编辑@deadshot
第五列的值来自这些:
sl2[4] = 0
new_data[a1][4] = 1
new_data[a2][4] = 2
new_data[a3][4] = 3
etc...
在第四列中,“X”只是帮助我找到氧原子的起点。
【问题讨论】:
-
什么是第 4 列以及如何计算第 5 列的值?提供第 5 列的示例计算