首页 > 解决方案 > Python字典没有遍历所有元素

问题描述

下面是我的 python 脚本,它需要遍历所有具有逻辑路径的物理磁盘以及直接磁盘

如果我们找到任何logical_paths然后我们得到相应的物理磁盘然后我们删除逻辑部分并将其对应的物理磁盘添加到检查字典中

check={
        "/dev/disks/DISK2": "",
        "/dev/disks/DISK4": "",
        "/dev/disks/DISK5": "",
        "/dev/disks/DISK1": "",
        "/dev/disks/DISK6": "",
        "/dev/disks/DISK3": "",
        "/dev/sda": "/dev/sda"

}
logical_paths={
        "/dev/disks/DISK2": "/ dev / sdc1",
        "/dev/disks/DISK4": "/ dev / sdd2",
        "/dev/disks/DISK5": "/ dev / sde1",
       "/dev/disks/DISK1": "/dev/sdb4"
}
for a in check.keys():
     print("*****")
     print("disk is:"+a)
     if a in logical_paths:
         check[logical_paths[a]]=check[a]
         check.pop(a,None)
print("####")
print(check)

但我的脚本的输出是:

*****
disk is:/dev/oracleasm/disks/DISK2
*****
disk is:/dev/oracleasm/disks/DISK4
*****
disk is:/dev/oracleasm/disks/DISK5
*****
disk is:/dev/oracleasm/disks/DISK1
*****
disk is:/ dev / sdc1
*****
disk is:/ dev / sdd2
*****
disk is:/ dev / sde1
*****
disk is:/dev/sdb4

为什么要遍历disk6,disk3和SDA

标签: pythonpython-3.xdictionary

解决方案


只需list从您的密钥创建一个,然后在创建的密钥列表之上进行迭代。

背景

你的问题是你dict在迭代它时修改了你的。这导致底层结构的变化。如果你想明确地看到这一点,你可以注释掉check.pop(a)然后你会得到一个错误RuntimeError: dictionary changed size during iteration。简而言之,您应该避免dict在迭代它们时修改键。有关您的问题的详细说明,请参阅:Modify a Python dict while iterate over it

固定代码

check={
        "/dev/disks/DISK2": "",
        "/dev/disks/DISK4": "",
        "/dev/disks/DISK5": "",
        "/dev/disks/DISK1": "",
        "/dev/disks/DISK6": "",
        "/dev/disks/DISK3": "",
        "/dev/sda": "/dev/sda"

}
logical_paths={
        "/dev/disks/DISK2": "/ dev / sdc1",
        "/dev/disks/DISK4": "/ dev / sdd2",
        "/dev/disks/DISK5": "/ dev / sde1",
       "/dev/disks/DISK1": "/dev/sdb4"
}
for a in list(check):
     print("*****")
     print("disk is:"+a)
     if a in logical_paths:
         check[logical_paths[a]]=check[a]
         check.pop(a)
print("####")
print(check)

输出:

*****
disk is:/dev/disks/DISK2
*****
disk is:/dev/disks/DISK4
*****
disk is:/dev/disks/DISK5
*****
disk is:/dev/disks/DISK1
*****
disk is:/dev/disks/DISK6
*****
disk is:/dev/disks/DISK3
*****
disk is:/dev/sda
####
{'/dev/disks/DISK6': '', '/dev/disks/DISK3': '', '/dev/sda': '/dev/sda', '/ dev / sdc1': '', '/ dev / sdd2': '', '/ dev / sde1': '', '/dev/sdb4': ''}

推荐阅读