Python 当使用生成器时,如何使词典保持最新?

Python 当使用生成器时,如何使词典保持最新?,python,dictionary,generator,Python,Dictionary,Generator,当我使用生成器时,即使我修改了传递给它的字典,生成器仍然会给我一个旧数据结构的结果。 我怎样才能解决这个问题 def min_key_order(adict:dict): for key, value in sorted(adict.items()): yield (key, value) d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'} i = min_key_order(d) print(next(i)) d.pop(2) print

当我使用生成器时,即使我修改了传递给它的字典,生成器仍然会给我一个旧数据结构的结果。 我怎样才能解决这个问题

def min_key_order(adict:dict):
    for key, value in sorted(adict.items()):
        yield (key, value)

d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'}
i = min_key_order(d)
print(next(i))
d.pop(2)
print(next(i))

它给了我
(1,'a')
(2,'x')
,甚至我还有字典里的弹出键2。

你的生成器没有在字典上迭代。它正在迭代一个新的列表对象,该对象
sorted()
返回:

>>> d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'}
>>> l = sorted(d.items())
>>> d
{1: 'a', 2: 'x', 4: 'm', 8: 'd', 16: 'f'}
>>> l
[(1, 'a'), (2, 'x'), (4, 'm'), (8, 'd'), (16, 'f')]
>>> d.pop(2)
'x'
>>> l
[(1, 'a'), (2, 'x'), (4, 'm'), (8, 'd'), (16, 'f')]
从字典中删除项目无法更新新列表;该结构不是词典的实时视图

为此,您必须在每次迭代中对字典重新排序,并跟踪迭代位置:

def sorted_view(d):
    pos = 0
    while pos < len(d):
        yield sorted(d.items())[pos]
        pos += 1

但是,如果您添加了更多密钥,这将无法检测。

您的生成器没有在字典上迭代。它正在迭代一个新的列表对象,该对象
sorted()
返回:

>>> d = {1:'a', 2:'x', 4:'m', 8:'d', 16:'f'}
>>> l = sorted(d.items())
>>> d
{1: 'a', 2: 'x', 4: 'm', 8: 'd', 16: 'f'}
>>> l
[(1, 'a'), (2, 'x'), (4, 'm'), (8, 'd'), (16, 'f')]
>>> d.pop(2)
'x'
>>> l
[(1, 'a'), (2, 'x'), (4, 'm'), (8, 'd'), (16, 'f')]
从字典中删除项目无法更新新列表;该结构不是词典的实时视图

为此,您必须在每次迭代中对字典重新排序,并跟踪迭代位置:

def sorted_view(d):
    pos = 0
    while pos < len(d):
        yield sorted(d.items())[pos]
        pos += 1

但是,如果您添加了更多的键,这将无法检测。

您无法迭代更改的词典。这是不受支持的行为。但是,
sorted()
函数会生成一个新列表;该列表不会更新以跟随原始目录中的更改。这两者都与生成器无关,如果将
d.pop()
放在
for
循环中
sorted(d)
,则会得到相同的行为。您不能迭代更改的词典。这是不受支持的行为。但是,
sorted()
函数会生成一个新列表;该列表不会随着原始DICITORY中的更改而更新。这两者都与生成器无关,如果将
d.pop()
放入
for
循环
排序(d)
,则会得到相同的行为。