用python合并复杂矩阵

用python合并复杂矩阵,python,list,Python,List,我有一个复杂的矩阵,如下所示: [[ ['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项长列表,

我有一个复杂的矩阵,如下所示:

[[ ['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项长列表,但理论上我想为无限多个相同大小的组解决这个问题。

您可以在此处使用
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']]
这里有一个“有趣”的解决方案。由于您没有提供有关阵列结构的任何信息,因此我采用了最简单的变体:

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)

最后,如果您只想处理复数,那么有更好的方法可以实现。最后,我想将其转换为javascript。我只是讨厌js,所以我试着先用python来做它=]在他的例子中,我相信“x”是一个值,而不是与“y”相同的键“No No@drabo2005”这就是我想要的答案。我已经朝那个方向走了,我只是试着避免使用字典,但可能没有更好的了way@yuvi我添加了另一个解决方案,尽管它不像第一个那么可读。哇。这就是我最初搜索的内容,使用zip和map之类的工具,避免使用字典。谢谢你的帮助,我真的很感激@尤维很高兴这有帮助。:-)这绝对是美妙的,但这次我实际上需要一个不使用外部库的解决方案。我在问题中没有提到,很抱歉。给了你1分+