从 Python 字典中删除“第一个”项目

Raf*_*eis 7 python recursion dictionary

下午好。

如果我的问题看起来很愚蠢或者它已经发布(我寻找过但似乎没有找到任何东西),我很抱歉。如果我错了,请告诉我:我是新来的,我可能会不是最擅长寻找正确问题)。

我想知道是否可以从 python 字典中删除(弹出)通用项目。这个想法来自以下练习:

编写一个函数来查找给定字典中的 VALUES 之和。

显然有很多方法可以做到这一点:求和dictionary.values(),为总和创建一个变量并迭代字典并更新它,等等。但我试图用递归来解决它,比如:

def total_sum(dictionary):
    if dictionary == {}:
        return 0 
    return dictionary.pop() + total_sum(dictionary) 
Run Code Online (Sandbox Code Playgroud)

这个想法的问题在于,我们不知道先验哪个可能是字典的“第一个”键,因为它是无序的:如果它是一个列表,那么索引 0 将被使用,并且一切都会起作用。由于我不关心项目弹出的顺序,因此有办法删除任何项目(“通用”项目)就足够了。你认为这样的事情是可能的还是我必须使用一些辅助变量,失去使用递归的全部意义,其优点是代码非常简洁?

我实际上找到了以下解决方案,不过,正如您所看到的,它使代码更加复杂且难以阅读:我认为如果有一些内置的、简单且直接的解决方案来解决该特定问题,它仍然会很有趣且有用删除字典的“第一个”项目,尽管可以找到许多“人为”的替代解决方案。

def total_sum(dictionary):
    if dictionary == {}:
        return 0
    return dictionary.pop(list(dictionary.keys())[0]) + total_sum(dictionary)
Run Code Online (Sandbox Code Playgroud)

如果您想进行一些简单的测试,我将为您提供一个可以应用该函数的简单示例字典。

ex_dict = {"milk":5, "eggs":2, "flour": 3}
Run Code Online (Sandbox Code Playgroud)

Sud*_*han 11

(k := next(iter(d)), d.pop(k))
Run Code Online (Sandbox Code Playgroud)

将从对象中删除最左边(第一个)项目(如果存在)dict

如果你想从字典中删除最正确/最近的值

d.popitem()
Run Code Online (Sandbox Code Playgroud)


小智 3

ex_dict.popitem()

它从字典中删除最后一个(最近添加的)元素

  • 答案误导性地指出 popitem() 返回_第一个_元素。根据文档:*对按 LIFO(后进先出)顺序返回。*更重要的是,只有*版本 3.7 中的更改*才正确:现在保证 _LIFO 顺序。在之前的版本中,popitem() 将返回任意键/值对。_ (7认同)