2012-06-07 57 views
0

我試圖逐步減去3D矩陣的值。該矩陣看起來像:python中的矩陣數據

ATOM 1223 ZX SOD A 11 2.11 -1.33 12.33 
ATOM 1224 ZY SOD A 11 -2.99 -2.92 20.22 
ATOM 1225 XH HEL A 12 -3.67 9.55 21.54 
ATOM 1226 SS ARG A 13 -6.55 -3.09 42.11 
... 

這裏最後三列分別代表軸x,y,z的值。 現在我想要做的是,取第一行x,y,z的值,並用第二,第三,第四行以迭代方式減去並打印每個軸的值。 我用:

for line in map(str.split,inp): 
    x = line[-3] 
    y = line[-2] 
    z = line[-1] 

分離的值,但如何在迭代的方式做到。我應該使用Counter來做到這一點。
預期輸出:
爲一號線2號線VS​​:5.1 1.59 -7.89
爲行1 VS 3號線:5.78 -10.88 -9.21
......等等。

+0

expcted輸出? –

+0

你是什麼意思的迭代方式? – amazingjxq

回答

1

這會給你一個[x,y,z]列表的列表,你可以遍歷/解壓。

mylist = [map(float, line[-3:]) for line in map(str.split, inp)] 

但是,如果你要反覆產生減去X,Y,Z值的新行的結果,最好的辦法是寫一個發電機的功能,如:

def matrix_gen(inp): 
    """ iteratively subtracts values from first line of input 3D matrix """ 
    if len(inp) < 1: raise StopIteration 
    first_line = inp[0].split() 
    x,y,z = map(float, first_line[-3:]) 
    yield x,y,z 
    for elem in inp[1:]: 
     line = elem.split() 
     new_x, new_y, new_z = map(float, line[-3:]) 
     yield x - new_x, y - new_y, z - new_z 

的發生器將首先產生您的初始x,y,z值,然後將產生從前一個值中減去矩陣中下一個x,y,z值的結果。然後你就可以生成你的(X,Y,Z)通過元組:

for x,y,z in matrix_gen(inp): 
    # do something 

如果你不希望打印的第一線,只是刪除第一yield聲明。

看起來你想要一個字符串作爲輸出,你可以做生成此字符串列表:

[' '.join(x) for x in matrix_gen(inp)] 
+0

迭代是好的,計數器是好的,循環是好的.... – fanlix

0

itertools更好:

import itertools 

ss = ['ATOM 1223 ZX SOD A 11 2.11 -1.33 12.33', 
     'ATOM 1224 ZY SOD A 11 -2.99 -2.92 20.22', 
     'ATOM 1225 XH HEL A 12 -3.67 9.55 21.54', 
     'ATOM 1226 SS ARG A 13 -6.55 -3.09 42.11'] 

mylist = [map(float, i.split()[-3:]) for i in ss] 
print [list(itertools.imap(lambda x,y: x - y, i[0], i[1])) for i in itertools.combinations(mylist, 2)]