【问题标题】:How to handle dictionary keys that do not exist in a loop?如何处理循环中不存在的字典键?
【发布时间】:2020-03-07 16:37:58
【问题描述】:

我尝试解析 json 并在 Python 中使用 for 循环。 obj 是 json,如您所知,它就像字典中的字典中的列表中的字典......等等。

所以我解析 json 并将其设置为 for 循环,如下所示:

all = obj['products']
for a in obj:
      recommendSellerScore.append(a['recommendSellerScore'])

但是,问题是'recommendSellerScore',它是某些列表中不存在的键。

我想要的结果是打印'None',其中recommendSellerScore 不存在,并打印值recommendSellerScore 确实存在。

for a in all:
    if a['recommendSellerScore'] in all:
        recommendSellerScore.append(a['recommendSellerScore'])
    else:
        continue
        print('None')

我在上面运行了这段代码,但由于'recommendSellerScore' 不存在而出现错误。

for a in all:
    if ['recommendSellerScore'] in all:
        recommendSellerScore.append(a['recommendSellerScore'])
    else:
        continue
        print('None')

然而,这个有效,因为'recommendSellerScore' 存在于字典的列表中,所以它是不可迭代的。 (我猜)

请修复我的代码,我们将不胜感激任何 cmets 或建议!

【问题讨论】:

  • @hitter 感谢您的回答。我可以知道如何在 cmets 上投票吗?只有我能看到 cmets 上的一个标志。

标签: python dictionary for-loop jsonparser


【解决方案1】:

你可以使用字典的get方法来尝试访问字典值,如果key不存在你可以提供一个默认值,如果你不指定一个,它会输出None,例如:

key = 'recommendSellerScore'
a = [{key: 1}, {}]

recommendSellerScore = []
for d in a:
    score = d.get(key)
    if score is not None:
        print(score)
        recommendSellerScore.append(score)
    else:
        print('None')

编辑:正如@kederrac 所指出的,如果您的数据可以具有{key: None} 值并且您有兴趣保留这些None 值,那么最好询问该键是否确实存在于字典中,例如:

key = 'recommendSellerScore'
a = [{key: 1}, {key: None}]

recommendSellerScore = []
for d in a:
    if key in d.keys():
        print(d[key])
        recommendSellerScore.append(d[key])
    else:
        print('None')

它将打印:

>>> 1
>>> None 

【讨论】:

  • 如果a = [{key: None}, {}] 怎么办?您的代码将无法在 recommendSellerScore 中存储 None
  • @kederrac,是的,在这种情况下,请参阅Edit
  • 如果你有a = [{key: 1}, {key: None}, {1:1}] ?
【解决方案2】:

这是您的代码的固定版本(我取出了continue 语句和字符串周围的[]):

for a in all:
    if "recommendSellerScore" in a:
        recommendSellerScore.append(a["recommendSellerScore"])
    else:
        print("None")

【讨论】:

  • 不要使用"something" in a,因为如果在值中找到“某物”,它可能无法按预期工作。 "something" in a.keys() 更加安全和明确。
  • @Guimute你错了,"something" in a"something" in a.keys()一样
  • 这是迄今为止最好的答案;)
  • @kederrac 我的错,我和dictviews 混在一起了。明确检查键或值仍然是个好主意。
  • @Guimute 感谢您的建议!它与“.keys()”一起使用。结果我使用的代码是:for a in all: if "recommendSellerScore" in a.keys(): recommendSellerScore.append(a["recommendSellerScore"]) else: recommendSellerScore.append("None")
【解决方案3】:

也许下面的代码对你有用?

for a in all:
    if a.get(['recommendSellerScore']) is not None:
        recommendSellerScore.append(a['recommendSellerScore'])
  else:
      print("None")
      # No need for continue here.

【讨论】:

  • 您不能将列表作为字典中的键,您的代码应该引发:TypeError: unhashable type: 'list'
  • 你也不能在列表中使用dict.get
  • OP 说 obj 是 json -> 因此在 json 加载后翻译成字典
  • 看看你的第一条评论,你认为a 是一个字典
猜你喜欢
  • 2014-04-15
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2015-09-15
相关资源
最近更新 更多