关于迭代不断变化的词典有很多问题,但我正在研究一个奇怪的案例:
我有一个字典(特别是kwargs
),它将包含用于定义对象的键值对。对象的字段可以具有子字段。所以这是一个例子:
kwargs = {'field1':1,
'field2':2,
'field3.a':31,
'field3.b':32,
'field3.c':33,
'field4':4}
问题是当我处理时,我需要立即处理所有的field3,并确保当时所有的都存在。所以这是我需要做的一个例子:
if key.startswith('field3'):
assert 'field3.a' in kwargs
assert 'field3.b' in kwargs
assert 'field3.c' in kwargs
a = kwargs.pop('field3.a')
b = kwargs.pop('field3.b')
c = kwargs.pop('field3.c')
str = 'a: %s b:%s c:%s' % (a,b,c)
results.append(str)
问题是这可能会在kwargs.keys()
或kwargs.iteritems()
之间循环,因为我会删除这些字段,然后再尝试访问它们。我想我可以用
for k in kwargs.keys():
if k in kwargs:
#blah
但我想知道是否有一种更优雅的解决方法。
答案 0 :(得分:1)
我会把工作分成几步。在第一步中,您将所有字段收集到一个新字典中。
例如:
fields = defaultdict(dict)
for key, value in kwargs.iteritems():
if '.' in key:
field, subkey = key.split('.', 1)
else:
field, subkey = key, ''
fields[field][subkey] = value
现在你在fields
中有这样的事情:
{'field1': {'': 1},
'field2': {'': 2},
'field3': {'a': 31, 'c': 33, 'b': 32},
'field4': {'': 4}}
从那时起,按照您想要的方式处理数据应该更容易。