2012-06-07 56 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)]