我正在尝试生成一个列表来索引坐标(x,y和z),给定一组原子索引。我的问题很简单,如何优雅地从这个列表中去:
atom_indices = [0, 4, 5, 8]
到此列表:
coord_indices = [0, 1, 2, 12, 13, 14, 15, 16, 17, 24, 25, 26]
到目前为止,我最简单的阅读/理解方式是:
coord_indices = []
for atom in atom_indices:
coord_indices += [3 * atom,
3 * atom + 1,
3 * atom + 2]
但这似乎不是Pythonic。如果没有获得列表列表或元组列表,有没有更好的方法?
答案 0 :(得分:5)
怎么样:
>>> atom_indices = [0, 4, 5, 8]
>>> coords = [3*a+k for a in atom_indices for k in range(3)]
>>> coords
[0, 1, 2, 12, 13, 14, 15, 16, 17, 24, 25, 26]
我们可以按照我们编写循环的顺序在列表推导中嵌套循环,即这基本上是
coords = []
for a in atom_indices:
for k in range(3):
coords.append(3*a+k)
不要害怕for
循环,如果他们在这种情况下更清楚的话。由于我从未完全理解的原因,有些人觉得他们在水平而不是垂直编写代码时会更聪明,即使它使调试更难。