python:迭代一个不断变化的字典

时间:2015-12-08 19:11:51

标签: python python-2.7 dictionary

关于迭代不断变化的词典有很多问题,但我正在研究一个奇怪的案例:

我有一个字典(特别是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

但我想知道是否有一种更优雅的解决方法。

1 个答案:

答案 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}}

从那时起,按照您想要的方式处理数据应该更容易。