2016-05-17 4 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

Добро пожаловать в переполнение стека. Всегда полезно поделиться тем, что вы пробовали до сих пор, и где вы столкнулись с проблемой. –

+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] 
Смежные вопросы