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
语句)和对函数本身的任何递归调用。也就是说,有各种各样的标准递归模式用于处理诸如阶乘和斐波那契计算、二叉树遍历等问题。我发现熟悉这些模式很有帮助,然后扩展它们来解决稍微不同的问题,例如您案例中的问题。有关示例,请参见