2013-09-21 7 views
1

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

[[ ['x', '1', '2', '3', '4'], 
    ['y', '5', '6', '7', '8']], 

[ ['x', 'a', 'b', 'c', 'd'], 
    ['y', 'e', 'f', 'g', 'h'] ] ] 

Я хочу, чтобы превратить его в это:

['x', '1a', '2b', '3c', '4d'], 
['y', '5e', '6f', '7g', '8h'] 

Я разоряя мой голова, но не умея достичь результата. Кроме того, хотя у меня есть только две группы вложенных 5-позиционных списков, теоретически я хочу решить это для бесконечного числа групп того же размера.

+0

В конце концов, если все, что вы хотите сделать, это управлять комплексным числом, есть лучшие способы сделать это. – Rohit

+0

, в конце концов, я хочу перевести это на javascript. Я просто ненавижу js, поэтому я попытался сделать это в python first =] – yuvi

ответ

2

Вы можете использовать dict здесь:

>>> from operator import add 
>>> lis = [[ ['x', '1', '2', '3', '4'], 
    ['y', '5', '6', '7', '8']], 
[ ['x', 'a', 'b', 'c', 'd'], 
    ['y', 'e', 'f', 'g', 'h'] ] ] 
>>> dic = {} 
for item in lis: 
    for x in item: 
     k, v = x[0], x[1:] 
     if k in dic: 
      dic[k] = map(add, dic[k], v) 
     else: 
      dic[k] = v 
...    
>>> dic 
{'y': ['5e', '6f', '7g', '8h'], 'x': ['1a', '2b', '3c', '4d']} 
#list of lists 
>>> [[k] + v for k, v in dic.iteritems()] 
[['y', '5e', '6f', '7g', '8h'], ['x', '1a', '2b', '3c', '4d']] 

Другое решение с использованием zip, reduce и список понимание:

>>> from operator import add 
>>> def func(x, y): 
...  return map(add, x, y[1:]) 

>>> [[item[0][0]] + reduce(func, item[1:], item[0][1:]) for item in zip(*lis)] 
[['x', '1a', '2b', '3c', '4d'], ['y', '5e', '6f', '7g', '8h']] 
+0

в своем случае я считаю, что «x» - это значение, не являющееся ключевым для «y» – drabo2005

+0

Нет нет @ drabo2005, это тот ответ, который я искал. Я уже направлялся в этом направлении, я просто пытался избежать использования словаря, но, вероятно, нет лучшего способа – yuvi

+0

в порядке, я видел его обновление сейчас, красивое – drabo2005

1

Вот "весело" решение. Поскольку вы не предоставили никакой информации о структуре вашего массива, я предположил, самый простой вариант:

import numpy 

a = numpy.array([[ 
     ['x', '1', '2', '3', '4'], 
     ['y', '5', '6', '7', '8']], 
    [ 
     ['x', 'a', 'b', 'c', 'd'], 
     ['y', 'e', 'f', 'g', 'h']]], 
    dtype=numpy.object) 

res = a[0].copy() 
for chunk in a[1:]: 
    res[:,1:] += chunk[:,1:] 

print(res) 
+0

Это абсолютно красиво, но на этот раз мне действительно нужно решение, которое не использует внешние библиотеки. Я не упоминал об этом в этом вопросе, сожалею об этом. Дал вам 1+ – yuvi

Смежные вопросы