首页 文章

使用列表中的值迭代字典

提问于
浏览
0

我'm working with some data that has ever-changing keys for each record. I'收集了每个记录的主密钥列表并将它们存储在列表中 . 我想迭代遍历列表以使用 try catch 拉出适当的值,但由于列表项中的项为 str 且字典为 dict ,我收到错误 .

举个例子,注意嵌套键的可能性 . 否则我的方法会简单得多:

records = [{
  "id": 2017215,
  "name": "foo bar"
  "campaign": {
    "id": 161,
    "name": "Historical Data Campaign"
  }
},
{
  "id": 2017215,
  "name": "foo bar",
  "last_updated": "2018-01-01",
  "campaign": {
    "id": 161,
    "name": "Historical Data Campaign"
  }
}]

keys = [ ['id'], ['name'], ['campaign'], ['campaign']['id'], ['campaign']['name'], ['last_updated'] ]

for record in records:
  for key in keys:
    print (record + key) # assumption was this would generate "record['id']" but errors due to mismatched types.

我是否比实际需要更难?最大的问题是密钥可以从记录更改为记录,在某些情况下,数据中存在嵌套密钥 .

1 回答

  • 1

    首先,如果你做了一些事情,你可以使上面的代码片段工作

    records = # ...
    keys = [ ('id',), ('name',), ('campaign',), ('campaign', 'id'), ('campaign', 'name'), ('last_updated',) ]
    
    for record in records:
        for key_tuple in keys:
            obj = record
            for key in key_tuple:
                obj = record[key]
            print(obj)
    

    您的代码段中的一个问题是 ['campaign']['id'] 等元素的出现 . Python假设 ['campaign'] 部分是文字列表定义,然后 ['id'] 正在索引该列表(但't because it'不是整数) .

    更一般地说,我建议查看字典的.items()方法 . 您可以将上面的代码段转换为

    for record in records:
        for key, value in record.items():
    
            # to handle nested dictionaries
            if isinstance(value, dict):
                for subkey, subval in value.items():
                    print(subkey, subval)
            else:
                print(key, val)
    

    这将处理任何键,但如果您有两个以上级别的嵌套字典,您可能希望将其重新实现为递归函数 .

相关问题