【问题标题】:Why does this list comprehension only "sometimes" work?为什么此列表理解仅“有时”有效?
【发布时间】:2020-10-13 06:33:04
【问题描述】:

更新:确定迭代发生在错误的变量上

我正在编写一个脚本来从 json 数据中解析“主机名”对象,并且使用列表推导仅“有时”有效。当我对 Python 比较陌生时,我已经看到过这种行为,但是现在我再次看到它,这没有任何意义;列表推导应该起作用或者不应该起作用,没有歧义。

具体来说,变量 parsed_data2_hostnames 的列表解析不起作用,它是变量 parsed_data_hostnames 的正常工作列表解析的精确副本。首先,您可以看到变量 parsed_data_hostnames 的列表推导工作得非常好,并且我能够得到响应,因此这告诉我列表推导的结构是完整的。其次,如果我将失败的列表理解转换为“正常”的 for 循环,那么逻辑就起作用了!这进一步证明了列表理解是完整的,但由于某种原因它仍然不起作用。

这行不通……

parsed_data_hostnames = [i['hostname'] for i in parsed_data['resources']]
# parsed_data2_hostnames = []
# for i in parsed_data2_hostnames:
#     parsed_data2_hostnames = i['hostname']
parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']]
print(len(parsed_data_hostnames), type(parsed_data_hostnames))
print(len(parsed_data2_hostnames), type(parsed_data2_hostnames))

输出:

Traceback(最近一次调用最后一次): 文件“/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py”,第 146 行,在 parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']] 文件“/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py”,第 146 行,在 parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']] KeyError: '主机名'

但这确实...

parsed_data_hostnames = [i['hostname'] for i in parsed_data['resources']]
parsed_data2_hostnames = []
for i in parsed_data2_hostnames:
    parsed_data2_hostnames = i['hostname']
# parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']]
print(len(parsed_data_hostnames), type(parsed_data_hostnames))
print(len(parsed_data2_hostnames), type(parsed_data2_hostnames))

输出:

5000 0

编辑:验证主机名密钥确实存在于上述 json 数据中(基于 unix 的操作系统)...

with open('/Users/[name_omitted]/cs_results_parsed_2.json', 'w+', encoding='utf-8') as outf:
    json.dump(parsed_data2, outf, ensure_ascii=False, indent=4)

关闭我的 MacOS cmd 行...

[hostname_omitted]:venv [name_omitted]$ jq '.resources[].hostname' ~/cs_results_parsed_2.json | wc -l
    2243

(venv) [name_omitted]:venv [name_omitted]$ grep hostname ~/cs_results_parsed_2.json | more
            "hostname": "SIN-L-1007198",

[省略了 grep 输出的其余部分]

【问题讨论】:

  • 在您的代码的一个版本中,您正在循环使用parsed_data2。另一方面,您在 parsed_data2_hostnames 上循环,这是您刚刚创建的空列表。
  • 我不敢相信我错过了。我现在遇到同样的错误。很乐意将您标记为正确答案。

标签: python python-3.x list-comprehension


【解决方案1】:

正如 Blckknght 所说,在我的第二个“工作”示例中,我错误地迭代了 parsed_data2_hostnames 而不是 parsed_data2。一旦我纠正了这个错误,我确认我遇到了同样的 keyerror 问题。

由于我解析 json 数据的问题是一个完全独立的问题,我将关闭它。谢谢Blckknght。

【讨论】:

    猜你喜欢
    • 2016-12-26
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多