如何递归更新列表

时间:2019-02-20 21:44:39

标签: python

我有字典列表

a = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]

我想通过所有余数的总和来更新此列表中每个元素的值。 (因此'one'将获得值2+3+4+5)。

这样看起来像这样:

a = [{'one': 14}, {'two': 12}, {'three': 9}, {'four': 5}, {'five': 5}]

'five'是最后一个,因此不会更新。

我不确定该如何实现。我认为您构造了一个可以递归调用自己的函数,例如:

def recursive(a):
   if len(a) == 1:
      return list(a[0].values())[0]
    else:
      val = list(a[0].values())[0]
      return val + recursive(a.pop(0))

但是我不确定这样做list(a[0].values())[0]是“最佳”方法。这也得到了KeyError: 0

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

就地迭代解决方案

a = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]
sum_so_far = 0
first_flag = False
for i in a[::-1]:
    k,v = i.items()[0]   #For Python 3 k,v = list(i.items())[0]
    sum_so_far += v
    if first_flag:
        i[k] = sum_so_far # do not change the value at first

    first_flag=True

输出

[{'one': 15}, {'two': 14}, {'three': 12}, {'four': 9}, {'five': 5}]

答案 1 :(得分:3)

您的问题来自a.pop(0)的输出。 A.pop(0)返回值为0的元素,而不返回没有元素为0的列表。因此,当您递归调用时,您是在字典上索引,而不是列表。您希望在递归调用中输入什么?

我猜您正在尝试删除第0个索引,然后递归调用。为此,

a.pop(0);
return val + recursive(a)

编辑:注释-键错误0表示当键0还不存在时,您正在用键0索引字典。

答案 2 :(得分:0)

快速而肮脏的一根内胆...

[{list(d.keys())[0]: sum(list(v.values())[0] for v in a[i + (1 if i<len(a)-1 else 0):])} for i, d in enumerate(a)]

# [{'one': 14}, {'two': 12}, {'three': 9}, {'four': 5}, {'five': 5}]

答案 3 :(得分:0)

可能的递归解决方案:

d = [{'one': 1}, {'two': 2}, {'three': 3}, {'four': 4}, {'five': 5}]
def sums(data, _sum = 0):
  a, *b = data
  if not b:
    return [a], list(a.values())[0]
  c, _d = sums(b, _sum+list(a.values())[0])
  return [{list(a.keys())[0]:_d}, *c], _d+list(a.values())[0]

result, _ = sums(d)

输出:

[{'one': 14}, {'two': 12}, {'three': 9}, {'four': 5}, {'five': 5}]