2016-05-17 99 views
0

我正在使用python。我有一個名爲segments_init座標表,我想將它翻譯成另一種系統,如下所示:系統修改列表元素

segments_init = [x1, y1, z1, x2, y2, z2, x3, y3, z3, ...] 

segments_new = [x1, -z1, 0, x2, -z2, 0, x3, -z3, 0, ...] 

注:通過內置的命令在該軟件生成的每一個segments_init名單如下

for i in segments: 
    segment_init = ce.getVertices(ce.findByOID(segmentsOID)) 
+1

,什麼是你的問題是什麼呢? –

+0

歡迎來到Stack Overflow。分享到目前爲止您嘗試過的以及遇到問題的地方總是一個好主意。 –

+0

唉,OP需要改變'z'的符號...否則'new,new [1 :: 3],new [2 :: 3] = old [:],old [2 :: 3 ],[0] *(len(old)// 3)' – gboffi

回答

0
>>> segments_init = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> list(zip(segments_init[0::3], list(map(lambda x:-x, segments_init[2::3])), [0]*(len(segments_init)//3))) 
[(1, -3, 0), (4, -6, 0), (7, -9, 0)] 

即使其更好地俱樂部單個3D座標共同爲更好的可讀性,但如果你想變平的列表,你可以使用這個:

>>> [i for l in list(zip(segments_init[0::3], list(map(lambda x:-x, segments_init[2::3])), [0]*(len(segments_init)//3))) for i in l] 
[1, -3, 0, 4, -6, 0, 7, -9, 0] 
0

使用單行列表解析:

>>> segments_init = [1,2,3,4,5,6,7,8,9] 

>>>> [j if i%3 == 0 else -segments_init[i+1] if i%3 == 1 else 0 for i, j in enumerate(segments_init)] 
[1, -3, 0, 4, -6, 0, 7, -9, 0] 

另外,使用extended slicing

>>> segments_init = [1,2,3,4,5,6,7,8,9] 

>>> segments_new = list(segments_init) 
>>> segments_new[1::3] = [-i for i in segments_init[2::3]] 
>>> segments_new[2::3] = len(segments_init)//3 * [0] 

>>> segments_new 
[1, -3, 0, 4, -6, 0, 7, -9, 0]