通过递归合并它们的数组的子数组来操作(python)

时间:2016-03-31 14:15:28

标签: python arrays recursion

我有这个问题: 如果你有一个数组数组,让我们说,像这样

A = [[1, 2], [3, 6, 8, 1], [2, 4, 7]]

如何在前两个子阵列之间执行操作,并将结果写为新的子阵列,占据两个旧子阵列的位置,以便可以在此新子阵列和新子阵列之间递归地重新计算操作旁边一个,直到我们只得到一个数组?

2 个答案:

答案 0 :(得分:1)

您正在描述reduce操作:取两个项目,对它们应用一些操作,然后获取结果并对下一个项目应用相同的操作,依此类推。幸运的是,reduce是函数式编程中的一个基本概念,python内置了它:

def unique_append(left, right):
  return left + [elem for elem in right if elem not in left]
  # Example only! Don't do this with lists, use sets!

arr = [[1, 2], [3, 6, 8, 1], [2, 4, 7]]
print reduce(unique_append, arr)  
# [1, 2, 3, 6, 8, 4, 7]

这不会用结果替换前两个子数组,而是一直携带中间结果直到最后一个子数组,然后返回最终结果。它也不涉及递归,这里不需要。

如果你坚持原地更改原始阵列,你可以这样做(由于各种原因效率低而且速度慢):

# Slow, inefficient example
while len(arr) > 1:
  arr[:2] = some_operation(arr[0], arr[1])

答案 1 :(得分:0)

递归list listlist对前两项执行操作,并在仅add = lambda l1, l2: sum(l1 + l2) def func(lst): if len(lst) == 1: return lst lst = [[add(lst[0], lst[1])]] + lst[2:] return func(lst) if __name__ == "__main__": lst = [[1, 2], [3, 4, 5], [6, 7, 8, 9]] print(func(lst)) 离开时返回。

[[45]]

这将打印:

func

每次调用list时,前两个列表项都会应用你的“操作”(这里是两者的总和)。然后将结果放入另一个列表中,修剪最后两个列表,并重复递归调用该函数,直到只剩下一个reduce

正如其他人所说,这是一种更复杂,效率更低的方法。我发现自己只是在itertools和{{1}}开始做一个小例子来确定我的回复,但是,如果没有更详细的确切用例和情况,我会这样做以显示你问的是什么