【发布时间】:2021-02-17 18:02:54
【问题描述】:
我想定义一个生成器函数,它可以遍历正在发生变化的字典对象。
def generator(d):
for k,v in sorted(d.items()):
yield (k,v)
d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'}
i = generator(d)
print(next(i))
print(next(i))
del d[8]
print(next(i))
d[16] = "f"
d[32] = "z"
print(next(i))
print(next(i))
如果我执行上面的代码,我会得到:
(1, 'a')
(2, 'x')
(4, 'm')
(8, 'd')
(16, 'f')
期望的输出应该是:
(1, 'a')
(2, 'x')
(4, 'm')
(16, 'f')
(32, 'z')
我不明白的部分是当我将d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'} 分配给i = generator(d) 时,字典已经添加到函数generator(d) 中,并成为带有初始字典的生成器实例。因此,每当我使用del 函数时,生成器都会以d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'} 作为其参数保持不变。我将如何实现这一目标?
【问题讨论】:
-
你不能安全地这样做。您可能会删除迭代器刚刚返回的项目,这意味着迭代器现在指向下一次,但无论如何都会推进其指针,或者您添加的项目可能比当前位置更早添加,并且从未见过。
-
问题是
sorted(d.items())返回一个不是d的新字典。因此,当您del d[8]时,您的生成器不会受到影响,因为它正在遍历不是d的新字典。不知道如何解决您的问题。 -
@Loocid:
sorted(d.items())生成元组列表,而不是字典。但是,它仍然不是d,并且仍然不受d更改的影响。 -
请问物品需要分类吗?似乎键是唯一的,当其他东西发生变化时,无论如何都必须在其他具有更高键的elemnets之后输出更改。我的意思是让我们说,而不是
d[16],您决定更改d[2] = 'u'4 之后的输出,'m' 将是 2,'u 因为键值对已更改,所以排序目的是什么 -
@jimakr 项目不必排序。我之所以对它进行排序是因为我想获得不是每次都产生的最小键。