如何在迭代时成功弹出/删除字典项

时间:2018-07-24 11:57:50

标签: python dictionary recursion

我这里有一个函数,如果检测到词典字典(总是会发生这种情况),它将返回自身。我知道目前为止,我的函数一直运行到出现错误并达到递归深度限制为止。如果有k != numero,谁能知道我如何正确地从字典中弹出或删除某项。我曾尝试在else语句中从my_dict弹出k,但这会产生AttributeError,表明字符串不具备该功能。我通过pycharm调试器运行了代码,它将'four'显示为k,将'five'显示为v。这两个都是字符串,但是它们在字典中都存在键/值,所以我很困惑。

这是我的代码。

my_dict = {'one': {'two': 'three', 'four': 'five', 'six': 'seven'}}
k = ''
numero = 'six'

def find_location(d):
    global key
    for k, v in d.iteritems():
        if isinstance(v, dict):
            key = find_location(v)
        elif k == numero:
                print v
                print k
        else:
            return find_location(d)

1 个答案:

答案 0 :(得分:1)

通过使用del命令而不是pop,我设法获得了您描述的结果。这是我运行的脚本,需要进行一些修改,因为我使用的是python3。

my_dict = {'one': {'two': 'three', 'four': 'five', 'six': 'seven'}}
k = ''
numero = 'six'

def find_location(d):
    global key
    for k, v in d.items():
        if isinstance(v, dict):
            key = find_location(v)
        elif k == numero:
                print(v)
                print(k)
        else:
            print('Deleting ' + str(k) + ':' + str(d[k]))
            del d[k]
            print(d)
            return find_location(d)

    print(d)

find_location(my_dict)

让我知道它如何为您运行。

------更新

如果我正确理解,我认为我在您的代码中发现了问题。当您要递归调用函数时,必须使用return命令来执行,而在key = find_location(v)中则不需要。下面的代码有效。

my_dict = {'one': {'two': 'three', 'four': 'five', 'six': 'seven'}}
k = ''
numero = 'six'

def find_location(d):
    global key
    for k, v in d.items():

        if isinstance(v, dict):
            return find_location(v)
        elif k == numero:
                print(v)
                print(k)

                k = 'your-assigned-value'
                print(k)
                return k
        else:
            print('Deleting ' + str(k) + ':' + str(d[k]))
            del d[k]
            return find_location(d)

    return k



result = find_location(my_dict)

print('result = ' + str(result)) 

如果不使用return,Python会自动使函数return的结果等于null。希望这会有所帮助。