【问题标题】:Iterating through key value pairs in a python dictionary to build an list of objects遍历python字典中的键值对以构建对象列表
【发布时间】:2015-12-04 16:57:06
【问题描述】:

我需要将一些对象发布到烧瓶应用程序中,每个对象由 2 个键值对组成。

我正在使用邮递员测试将 1 个对象作为 json 发送,但我需要能够发送多个对象(同样每个对象都由 2 kv 对组成,如屏幕截图所示)

我的烧瓶应用看起来像:

json = request.get_json(force=True) # receives request from postman
for j in json:
        print str(j)

test = [{'a': j['key1'], 'token':j['key2']} for j in json ]

我想将 json 重建成一个字典列表('test'),其中 dic 包含 2 个 kv 对(即每个 dic 是一个对象)。

不幸的是我意识到因为上面的json是

{u'key2': u'xyz', u'key1': u'abc'}

我明白了:

TypeError: string indices must be integers

请看TypeError: string indices must be integers with flask json

在这种情况下,只有 1 个对象,但是如何遍历 json 变量来构建我需要的 dics 列表?

【问题讨论】:

  • 也许您需要import json 并使用json.loads 将您检索到的内容转换为字典,以便j['key1'] 有效?
  • 感谢您查看此内容,我不确定我是否理解。 {u'key2': u'xyz', u'key1': u'abc'} 已经是一个 dic。您介意详细说明吗?
  • 您正在遍历字典的键。
  • 你想发送多个对象...你打算怎么做?将它们放入列表中是有意义的,并且您的脚本是为处理列表而构建的。因此,在我看来,问题在于您通过邮递员发送的测试数据。只需将其放入列表中,一切正常。您的问题是错误的测试数据。
  • 谢谢,确实,在邮递员中将已发布的 json 放入 [] 时确实可以工作,我只是在寻找一种方法使代码更具容错性并能够处理单个和多个对象。

标签: python json flask


【解决方案1】:

假设json 是包含数据{u'key2': u'xyz', u'key1': u'abc'} 的字典,让我解构你的代码

test = [{'a': j['key1'], 'token':j['key2']} for j in json ]

您实际上在做的是遍历字典中的键,然后将结果视为字典,这会给您一个错误!

每个循环中json 中的j 是关键,因此在第一次迭代中您会得到结果'key1',当您尝试j['key1'] 时,您假设j 是一个字典,但实际上它是一个字符串,因此出现错误TypeError: string indices must be integers

这可能是您正在寻找的帮助您解决问题的方法。

这会给你一个字典列表:

test = [{key, value} for key, value in json.items()]

结果:

[{u'key2': u'xyz'}, {u'key1': u'abc'}]

您的代码失败的原因是您试图不必要地遍历字典,但如果您想反汇编它,只需这样做:

[dict(a=json['key1'], token=json['key2'])]

结果:

[{'a': u'abc', 'token': u'xyz'}]

【讨论】:

  • 谢谢vsachar,这很有帮助,我终于明白了错误的原因,但是我实际上正在寻找要存储的数据,例如 [{'a': u'abc', 'token ': u'xyz'}] 不是 [{'a': u'abc'}, {'token': u'xyz'}],每个字典都有多个键值并代表 1 个对象。
  • 对象是什么意思?这个数据{u'key2': u'xyz', u'key1': u'abc'} 是你的对象吗?我可以修改上面的代码给你想要的结果,但是你必须处理这种情况一次还是重复?
  • @user61629 我已经对代码进行了一些更改,以便为您提供一个带有新键的自字典。
  • Sorry test = [dict(a=json['key1'], token=json['key2'])] 给出同样的错误:TypeError: string indices must be integers
  • 根据您提供的测试数据,代码应该可以工作,但是如果 json 看起来像 [{u'key2': u'xyz', u'key1': u'abc'}](包含在列表中的字典),那么上面的代码将无法工作。我很困惑为什么您的测试数据不断从字典变为列表。
【解决方案2】:

我只是在寻找一种方法,让代码更具容错性,并且能够同时处理单个和多个对象

执行此操作的简单方法是检查传入的数据类型并将其更改为您的其余代码可以使用的标准化形式。如果你得到一个dict,只需创建一个list 来保存dict,其余代码就可以工作了。

json = request.get_json(force=True) # receives request from postman
for j in json:
        print str(j)

if isinstance(json, dict):
    json = [json]
test = [{'a': j['key1'], 'token':j['key2']} for j in json ]

【讨论】:

  • 谢谢,这是个好主意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 2013-01-21
  • 2021-11-21
  • 2022-11-20
相关资源
最近更新 更多