【问题标题】:Dealing with None in a list-of-list-of-dictionary处理字典列表列表中的 None
【发布时间】:2019-09-07 07:58:43
【问题描述】:

在这个 for 循环中:

for i in range(len(data_df)):
  for j in range(len(data_df.iloc[i].incident_updates)):
    print(data_df.iloc[i].incident_updates[j].get("affected_components"))

我得到这样的回应:

[{u'old_status': u'operational', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'operational'}]
[{u'old_status': u'partial_outage', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'operational'}]
[{u'old_status': u'operational', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'partial_outage'}]
[{u'old_status': u'partial_outage', u'code': u'31tyncvy5ng7', u'name': u'AB', u'new_status': u'operational'}]
[{u'old_status': u'operational', u'code': u'31tyncvy5ng7', u'name': u'AB', u'new_status': u'partial_outage'}]
None
None
[{u'old_status': u'partial_outage', u'code': u'xvgbw19sgbrj', u'name': u'AC', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'31tyncvy5ng7', u'name': u'AC', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'zg1gfkycdf6p', u'name': u'AC', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'lvj41y83ghdg', u'name': u'AD', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'2qdjrpnyn4mb', u'name': u'AB', u'new_status': u'operational'}, {u'old_status': u'partial_outage', u'code': u'24zyv2d3p2jf', u'name': u'AC', u'new_status': u'operational'}]
None
[{u'old_status': u'operational', u'code': u'31tyncvy5ng7', u'name': u'AA', u'new_status': u'major_outage'}]
None
None
...

因此,如果您注意到,有一些无。我知道那里没有任何价值,所以我想将它转换为一个看起来像这样[{'None':'None'}] 的字典列表 - 这样它看起来就像该输出响应中的其他列表 - 所以我可以将它保存到另一个列表,因此我可以从中获取name(使用list[i][j].dict.get())。我相信你明白了。

问题来了: 我能够将这个 for 循环的输出转换为字典列表列表(使用 list.append() 函数),并将 None 转换为字符串 'NONE',使用

affected_components_variable = ["NONE" if val is None else val for val in affected_components_variable]

affected_components_variable 是包含上述 for 循环输出的列表。它看起来像这样:

[[{u'old_status': u'operational', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'operational'}]
[{u'old_status': u'partial_outage', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'operational'}]
[{u'old_status': u'operational', u'code': u'rwdp37x0698r', u'name': u'AA', u'new_status': u'partial_outage'}]
...
'NONE'
...

这不符合我的目的,因为当我执行list[i][j].dict.get() 时,当它到达“NONE”时,它会抛出一个错误,显示为AttributeError: 'str' object has no attribute 'get' - 原因很明显。

为了避免这一切,我可以这样做:

for i in range(len(data_df)):
  for j in range(len(data_df.iloc[i].incident_updates)):
    for k in range(len(data_df.iloc[i].incident_updates[j].get("affected_components"))):
      print(data_df.iloc[i].incident_updates[j].get("affected_components")[k].get("name"))

由于同样明显的原因,这会引发同样的错误。

所以,我认为我需要这样做:[{'None':'None'}] 在列表级别,所以当我这样做 list[i][j].dict.get() 时,我会得到正确的响应。

非常感谢任何帮助。

【问题讨论】:

    标签: python-2.7 list dictionary


    【解决方案1】:

    为什么不设置像这样的变量

    noneResponse = [{u'None': u'None'}]
    

    如果没有,则分配。

    AffectedComponentsVariable = data_df.iloc[i].incident_updates[j].get("affected_components")
    AffectedComponentsVariable = NoneResponse if AffectedComponentsVariable is None else AffectedComponentsVariable
    

    【讨论】:

    • 所以我只是注意到我从执行此操作的初始 for 循环中获得的输出:print(data_df.iloc[i].incident_updates[j].get("affected_components")) 与将其附加到列表(命名为 affected_components_variable)时不同。订单发生了变化;意思是,列表中字典的顺序已经混乱了。没关系,但看起来甚至列表的顺序也发生了变化。不应该是这样,如果我理解正确的话。仅供参考,您可能已经猜到了,这是一个 JSON 数据。除了 JSON 和 Python 列表之外,还有其他限制吗?
    猜你喜欢
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多