You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从YAML向Python脚本传变量遇列表索引错误,求解决方案

解决YAML嵌套字典列表遍历的Python报错问题

首先咱们把问题拆解开:你遇到的list indices must be integers or slices, not str错误,核心是循环写法逻辑错误,再加上yaml加载的安全小问题,咱们一步步来解决。

修正后的完整代码(两种常见场景)

场景1:分别打印地址列表和掩码列表

如果你只是想单独遍历输出address和mask里的每一项,可以用这个写法:

#!/usr/bin/env python3
import yaml
import sys

def main():
    # 用safe_load替代load,避免潜在的代码注入风险
    with open(sys.argv[1], 'r') as f:
        inventory = yaml.safe_load(f)
    
    # 遍历address列表
    print("📋 源地址列表:")
    for addr in inventory['source']['address']:
        print(f"  - {addr}")
    
    # 遍历mask列表
    print("\n🔒 子网掩码列表:")
    for mask in inventory['source']['mask']:
        print(f"  - {mask}")

if __name__ == "__main__":
    main()

场景2:配对打印地址和对应的掩码

因为你的address和mask列表长度一致,大概率是要把每个地址和对应的掩码配对输出,这时候用zip()函数最合适:

#!/usr/bin/env python3
import yaml
import sys

def main():
    with open(sys.argv[1], 'r') as f:
        inventory = yaml.safe_load(f)
    
    # 先取出两个列表
    addresses = inventory['source']['address']
    masks = inventory['source']['mask']
    
    # 配对遍历
    print("🔗 地址-掩码配对:")
    for addr, mask in zip(addresses, masks):
        print(f"  - 地址:{addr},掩码:{mask}")

if __name__ == "__main__":
    main()

原代码报错的原因解析

咱们来扒一扒你原代码里的问题:

  1. 循环写法逻辑完全错误:
    你写的for i,j in ['source']['address'],['source']['mask']完全不符合Python语法逻辑:['source']是一个只包含字符串"source"的列表,你试图用['address'](又是一个列表)去索引它——但列表只能用整数或者切片来索引,这就直接触发了你看到的错误。

  2. yaml加载的安全隐患:
    旧版的yaml.load()存在代码注入风险,官方现在强烈推荐用yaml.safe_load()来加载不可信的YAML文件,这个好习惯得养成。

运行方式

把上述代码保存为parse_yaml.py,然后在终端运行:

python3 parse_yaml.py 你的yaml文件名.yaml

内容的提问来源于stack exchange,提问作者Federi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:37:44