Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 棘手的递归:从字典中减去值_Python_Python 3.x_Python 2.7 - Fatal编程技术网

Python 棘手的递归:从字典中减去值

Python 棘手的递归:从字典中减去值,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,假设我有一本字典和一个值: dic = {'1': 10, '2': 20, '3': 30} value1 = 25 我想得到以下信息: result = {'1': 0, '2': 5, '3': 30} result2 = {'1': 0, '2': 0, '3': 5} 假设我得到了另一个值: value2 = 30 我将获得以下信息: result = {'1': 0, '2': 5, '3': 30} result2 = {'1': 0, '2': 0, '3': 5}

假设我有一本字典和一个值:

dic = {'1': 10, '2': 20, '3': 30}
value1 = 25
我想得到以下信息:

result = {'1': 0, '2': 5, '3': 30}
result2 = {'1': 0, '2': 0, '3': 5}
假设我得到了另一个值:

value2 = 30
我将获得以下信息:

result = {'1': 0, '2': 5, '3': 30}
result2 = {'1': 0, '2': 0, '3': 5}
如您所见,当值为零时,它跳过第一个键,并继续迭代,直到从字典中完全减去值

以下是一些sudo代码:

value - a['1'] = 15 (remainder)
15 - a['2'] = -5  <- recursion or loop should stop as remainder is less than zero

return result = {'1': 0, '2': 5, '3': 30}
值-a['1']=15(余数)

15-a['2']=-5字典在任何Python版本<3.7中都是无序的。因为在这个问题中输入的顺序很重要,所以您可以为输入创建一个元组列表,并形成一个字典作为返回结果:

dic = {'1': 10, '2': 20, '3': 30}
value1 = 25
def new_d(d, c):
  [a, b], *_c = d
  return {a:0 if c > b else b-c, **({} if not _c else new_d(_c, 0 if b > c else abs(b-c)))}

print(new_d(list(dic.items()), value1))
输出:

{'1': 0, '2': 5, '3': 30}
{'1': 0, '2': 0, '3': 30}
{'1': 0, '2': 0, '3': 0, '4': 35, '5': 50}
带有
值2

value2 = 30
print(new_d(list(dic.items()), value2))
输出:

{'1': 0, '2': 5, '3': 30}
{'1': 0, '2': 0, '3': 30}
{'1': 0, '2': 0, '3': 0, '4': 35, '5': 50}

输出:

{'1': 0, '2': 5, '3': 30}
{'1': 0, '2': 0, '3': 30}
{'1': 0, '2': 0, '3': 0, '4': 35, '5': 50}
编辑:深入版本:

def new_d(d, c):
   [a, b], *_c = d
   result = {a:0 if c > b else b-c}
   if not _c:
      return result
   return {**result, **new_d(_c, 0 if b > c else abs(b-c))}

字典并没有真正的“第一”键,你们到底想在这里完成什么?请为你们迄今为止的尝试提供一个答案。请注意,因为您已经标记了python的两个不同版本:除了最新的几个python版本之外,任何其他版本都不能保证字典顺序。如果您想以这种方式操作,则需要另一种数据结构,如
orderedict()
@jornsharpe我在Redis中有一个散列,用于存储库存项目的数量。当我卖东西时,它应该从他们的“桶”中减去它们。然后,我将运行某种查询,检查所有这些项目的值,并将它们的售罄字段设置为True。
result
'3'
value1
的值不应该是
25
,因为计算链应该是
'10-25 |=15(但是注册0,因为25>10)
| 20-15 |=5
| 30-5 |=25
?。这通常意味着,你需要的是与当地导师一起度过的时间,或是浏览教程,而不是堆栈溢出。“如何使用递归实现这一点”是一个教程级的问题,与堆栈溢出无关。然而,如果你遵循你在网上找到的任何资源,进行诚实的编码尝试,并遇到问题,你就会有一个很好的例子来发布。当字典只有3个键时,这是正确的答案。当我使用dic={1':0,'2':20,'3':30,'4':40,'5':50}中的值55时,我得到:{1':0,'2':0,'3':0,'4':35,'5':15}。感谢您的帮助btwBtw,如果您有非一行程序版本,请随意分享,因为它将帮助我更多地了解您在这里所做的事情。再次感谢你Ajax@Anthony没问题,请看我最近的编辑。请让我知道编辑是否对您有帮助,或者您是否有任何问题。Ajax,与此问题无关,但您是如何轻松解决的?你建议我怎么做才能好起来。也许你可以推荐一些你用来变得更好的资源。我会很感激的,没问题。递归遵循基本情况的特定模式(不包括对函数本身的调用的
return
语句)和对函数本身的任何递归调用。也就是说,有各种各样的标准递归模式用于处理诸如阶乘和斐波那契计算、二叉树遍历等问题。我发现熟悉这些模式很有帮助,然后扩展它们来解决稍微不同的问题,例如您案例中的问题。有关示例,请参见