2013-09-30 3 views
2

По существу, я хочу подвести элементы в параллельных списков, например, так:Python: 3D список, сумма столбцов

[[1, 2, 3, 4], 
[4, 3, 2, 1]] # list of lists (can be more than two) 

[5, 5, 5, 5] # result 

Но подвох в том, что есть еще один аспект списков, по сути, что делает его '3D'. Но я только хочу подвести вторые элементы в сокровенном паре:

[[[0, 1], [0, 2], [0, 3], [0, 4]], 
[[1, 4], [1, 3], [1, 2], [1, 1]]] # add the numbers downward 

[[0, 5], [0, 5], [0, 5], [0, 5]] # result 

Первые элементы в каждой паре можно оставить в покое. Для них просто копирование первой строки в порядке.


В любом случае, я не могу придумать хороший способ сделать это. Я нашел этот путь:

l = [[[0, 1], [0, 2], [0, 3], [0, 4]], 
    [[1, 4], [1, 3], [1, 2], [1, 1]]] 

s = map(sum, zip(*[[j[1] for j in i] for i in l])) # to be summed 
o = [i[0] for i in l[0]] # others 

result = [[j for j in i] for i in zip(o, s)] 

... но я не могу его обнажить. Если есть более хороший способ, я буду очень благодарен.

Спасибо за все ваши умственные работы!

P.S. Помните, что в списке может быть любое количество списков, а не только 2!

+0

Вы смотрели на numpy массивов и масок? Я думаю, что первая часть «Моя конечная цель» делает вопрос немного запутанным. Может быть, вы должны принять эту часть. –

ответ

3

переменная итерация может быть распакованы следующим образом:

>>> for x in [[1,2], [3,4]]: print(x) 
... 
[1, 2] 
[3, 4] 
>>> for a,b in [[1,2], [3,4]]: print(a+b) 
... 
3 
7 
>>> for [a,b] in [[1,2], [3,4]]: print(a+b) 
... 
3 
7 

UPDATE

>>> xs = [[[0, 1], [0, 2], [0, 3], [0, 4]], 
...  [[1, 4], [1, 3], [1, 2], [1, 1]], 
...  [[1, 1], [1, 2], [1, 3], [1, 4]]] 
>>> 
>>> [[x[0][0],sum(b for a,b in x)] for x in zip(*xs)] 
[[0, 6], [0, 7], [0, 8], [0, 9]] 
+1

Я собирался опубликовать этот ответ :(Но я не знал о распаковке. 'Print [[item [0] [0], item [0] [1] + item [1] [1]] для элемента в zip (* Data)] ' – thefourtheye

+0

A_readable_ один лайнер! Именно то, на что я надеялся. Я могу применить это ко многим другим вещам, спасибо. – Jollywatt

+0

Держитесь, извините, что узнал об этом сейчас, но это управляет только двумя списками ... Мне нужен тот, который может управлять любым числом. Т.е. 'len (xs)' может быть больше двух. – Jollywatt

2

Как насчет использования numpy? Он также может работать с 3-мерными массивами, а просто подвести нужный фрагмент, используя np.sum на x[:,:,1] через заданную ось (0) и для того, чтобы сохранить столбцы из первой строки пронестись их вместе (x[0,:,0])

import numpy as np 
x = np.array([[[0, 1], [0, 2], [0, 3], [0, 4]], 
       [[1, 4], [1, 3], [1, 2], [1, 1]]]) 
zip(x[0,:,0], np.sum(x[:,:,1], axis=0)) 
Смежные вопросы