2013-06-04 32 views
0

我想要生成一個列表來索引座標(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。如果沒有得到列表或元組列表,有沒有更好的方法?

回答

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但是,如果它們在這種情況下更加清晰的話。由於我從來沒有完全理解的原因,有些人認爲他們在水平編寫代碼而不是垂直編寫代碼時更加聰明,儘管它會使調試更加困難。

+1

我相信列表推導可以更快,因爲它們被推到c代碼。 http://www.python.org/doc/essays/list2str.html – James

+0

@DSM感謝您的回答,您的評論是有效的。不過,我認爲在這種情況下,人們會非常清楚地知道3 * a + k部分發生了什麼。 –

+0

@Imagine:雖然好處通常很小。如果你實際上做的很貴,它會支配循環成本,或者你應該使用其他類似'numpy'的東西。如果開始時不昂貴,那麼這不值得擔心。 [順便說一句,我認爲你有錯誤的鏈接。] – DSM