Создайте больший список из существующего списка, используя понимание списка или карту ()

Я пытаюсь создать список для индексации координат (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. Есть ли лучший способ, о котором я не думал, не получив список списков или список кортежей?

1 ответ

Решение

Как насчет:

>>> 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 петли, хотя, если они более понятны в ситуации. По причинам, которые я никогда полностью не понимал, некоторые люди чувствуют себя более умными, когда пишут код горизонтально, а не вертикально, хотя это затрудняет отладку.

Другие вопросы по тегам