Python:如何动态迭代dict对象?

时间:2017-08-04 14:01:28

标签: python loops formatting

我想将数据写入文件,但数据可能因其来源而异。

目前我的代码只执行以下操作:

try:
    file.write('{value1}'.format(value1=data["value1"]))
except:
    pass

try:
    file.write('{value2}'.format(value2=data["value2"]))
except:
    pass

#...

由于输入数据的性质,这些值键可能存在也可能不存在,因此我为什么要这样做,所以当我得到KeyError时我可以忽略它。

所以我的问题是,有没有更好的方法来做到这一点?一个更'pythonic'的方式,而不是这个非常潮湿的解决方案?

example_input1:

'{"value1": 1.0, "value2": 1.2}'

example_input2:

'{"value2": 1.5}'

我想最终我应该对输入数据进行标准化,但不幸的是,这是来自第三方API,因此不是真正的选择。

4 个答案:

答案 0 :(得分:1)

是的,你可以简单地使用:

for key in ('value1','value2'):
    if key in data:
        file.write('{}'.format(data[key]))

所以这里if key in data首先检查字典中是否有密钥(例如'value1')。鉴于这种情况,我们使用file.write('{}'.format(data[key]))将相应的值写入文件。

使用for循环的优点是,您可以轻松地添加和删除要从文件中打印的键。

另一方面,如果你想要字典中的write 所有键,你可以迭代字典

for val in data.values():
    file.write('{}'.format(val))

请注意,字典中键/值的顺序不一定是插入顺序。所以这些价值可以改组。

答案 1 :(得分:1)

您可以使用json库将输入字符串转换为类字典对象。

>>> import json
>>> input1 = '{"value1": 1.0, "value2": 1.2}'
>>> input2 = '{"value2": 1.5}'
>>> input1 = json.loads(input1)
>>> input2 = json.loads(input2)
>>> for key in input1.keys():
...  print(input1[key])
... 
1.2
1.0
>>> for key in input2.keys():
...  print(input2[key])
... 
1.5

答案 2 :(得分:1)

如果订单在您的情况下不重要,您可以像下面一样循环显示数据:

for v in data.values():
    file.write('{}'.format(v))

<强>输出:

>>> data = {"value1": 1.0, "value2": 1.2}
>>> for v in data.values():
...     print(v)
...
1.2
1.0
>>>

答案 3 :(得分:1)

这取决于,但我认为你不想写你得到的所有数据,但只有一个如果它们存在

所以这是一种pythonic方式(try / except):

inputs = [
    {"value1": "foo", "value2": "bar"},
    {"value1": "foo"},
    {"value3": "baz", 'unexpected': '??'}
]

expected_keys = ['value1', 'value2', 'value3']

for data in inputs:
    for key in expected_keys:
        try:
            file.write(data[key])
        except KeyError:
            pass

inputs只是一个以dict为例的列表,expected_keys是您想要在输入中存在的密钥列表。

使用它,您永远不会错过现有密钥,如果缺少密钥,则永远不会提出KeyError

这是处理此问题的真正pythonic方式,请参阅Python's EAFP