关于python:迭代和改变字典

Iterating through and mutating dictionary

我遇到了反复阅读和修改字典的问题…

假设我有一本字典:

1
dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}

我想迭代dict1,使用其中的数据构建第二个字典。一旦完成了EDOCX1中的每个条目(0),我就删除它。

在伪代码中:

1
2
3
4
5
6
7
8
9
10
dict2 = {}

for an entry in dict1:
    if key is A or B:
        dict2[key] = dict1[key]   # copy the dictionary entry
    if key is C:
        do this...
    otherwise:
        do something else...
    del dict1[key]

我知道改变一个循环中一个不可数的长度会引起问题,而上述的问题可能并不容易实现。

这个问题的答案似乎表明我可以使用keys()函数,因为它返回一个动态对象。因此我尝试过:

1
2
3
4
5
6
7
8
for k in dict1.keys():
    if k == A or k == B:
        dict2[k] = dict1[k]
    elif k == C:
        dothis()
    else:
        dosomethingelse()
    del dict1[k]

但是,这只会给出:

'RuntimeError: dictionary changed size during iteration'

第一次删除后。我也尝试过使用iter(dict1.keys()),但得到了相同的错误。

所以我有点困惑,可以接受一些建议。谢谢


为什么不简单地dict1.clear()?注意到在循环中每次迭代都会删除每个元素吗?

我能想到的一个简单(天真)的解决方案是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
delkeys=[]
dict2 = {}

for an entry in dict1:
  if key is A or B:
    dict2[key] = dict1[key]         # copy the dictionary entry
  if key is C:
    do this...
  elif:
    do something else...
  delkeys.append(key)

for x in delkeys:
   del dict1[x]

只需使用.keys()方法创建一个独立的键列表。

下面是您的python 2.7代码的工作版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}
>>> dict2 = {}
>>> for key in dict1.keys():     # this makes a separate list of keys
        if key in ('A', 'B'):
            dict2[key] = dict1[key]
        elif key == 'C':
            print 'Do this!'
        else:
            print 'Do something else'
        del dict1[key]

Do this!
Do something else
>>> dict1
{}
>>> dict2
{'A': 'first', 'B': 'second'}

对于python 3,在.keys()周围添加list()并使用print函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> dict1 = {'A' : 'first', 'B' : 'second', 'C' : 'third', 'D' : 'fourth'}
>>> dict2 = {}
>>> for key in list(dict1.keys()):     # this makes a separate list of keys
        if key in ('A', 'B'):
            dict2[key] = dict1[key]
        elif key == 'C':
            print('Do this!')
        else:
            print('Do something else')
        del dict1[key]

Do this!
Do something else
>>> dict1
{}
>>> dict2
{'A': 'first', 'B': 'second'}