【问题标题】:Adding elements to a dictionary via for loop通过 for 循环将元素添加到字典
【发布时间】:2017-05-06 01:12:04
【问题描述】:

Python 3.6

所有调试输出均来自 PyCharm 2017.1.2

我有一个程序正在处理一个缺陷。

这是我遇到问题的部分:

def striplist(errlist):
    return [item.strip() for item in errlist]

for line in shintlist:
    errors_list = striplist(line.split(","))

    errRegex = re.compile(r'(\d+)(\s)(\D+)')

    errdict = {}
    for elem in errors_list:
        mo = errRegex.search(elem)
        errdict[mo.group(3)] = int(mo.group(1))
        if int(mo.group(1)) > 0:
            print("There are errors")
        else:
            print("There are no errors")

    print(errdict)

** 注意** 打印语句仅供我此时使用 检查程序逻辑。稍后将删除它们。

在这些指令执行时,'shintlist' 是逗号分隔的字符串列表。

__len__ = {int} 9
0 = {str} '     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored'
1 = {str} '     0 watchdog'
2 = {str} '     0 input packets with dribble condition detected'
3 = {str} '     5912 packets output, 738736 bytes, 0 underruns'
4 = {str} '     0 output errors, 0 collisions, 2 interface resets'
5 = {str} '     4 unknown protocol drops'
6 = {str} '     0 babbles, 0 late collision, 0 deferred'
7 = {str} '     0 lost carrier, 0 no carrier'
8 = {str} '     0 output buffer failures, 0 output buffers swapped out'

上面的代码有效。它在“,”上正确拆分,然后剥离 离开白色空间。然后它创建一个字典键:值 输入错误{}:

errdict = {dict} {'input errors': 0}
 __len__ = {int} 1
 'input errors' (64451912) = {int} 0

我遇到的问题是:每次迭代都会覆盖 errdict{} 'shintlist' 的下一行。

我想做的是:

如果每个单个项目的每个单个值都为零 (0): 如果 int(mo.group(1)) > 0: 然后跳过这个界面。如果任何一个值大于零,则 我希望字典 'errdict{}' 包含上述所有行 来自 'shintlist' 所以我有一本包含所有内容的字典。

** 注意 2** 这些条目:5912 个数据包输出,738736 字节,将始终 对于活动接口,非零。我稍后会处理这些。

当 'shintlist' 中的每一行时,这些行中的每一行都是 errdict{} 的状态 已处理:

{'input errors': 0, 'CRC': 0, 'frame': 0, 'overrun': 0, 'ignored': 0}
{'watchdog': 0}
{'input packets with dribble condition detected': 0}
{'packets output': 6304, 'bytes': 786190, 'underruns': 0}
{'output errors': 0, 'collisions': 0, 'interface resets': 2}
{'unknown protocol drops': 4}
{'babbles': 0, 'late collision': 0, 'deferred': 0}
{'lost carrier': 0, 'no carrier': 0}
{'output buffer failures': 0, 'output buffers swapped out': 0}

如果有任何单个值,我想要一个包含所有行和值的字典 非零,因此我可以打印一份报告,显示所有有错误的接口。

除非我很遥远,否则我在问如何将每一行附加到 errdict{} 而不是覆盖?

谢谢。

【问题讨论】:

  • dkv,我欠你一杯啤酒!!这是一项正在进行的工作,我的程序的先前版本更加“线性”——逻辑没有使用循环:我只是用一行测试以确保函数和列表理解有效。然后我添加了循环并将 errdict{} 放入循环中。我在这方面基本上还是个新手,所以... 吸取教训。再次,非常感谢。我非常感激。顺便说一句,我刚刚实施了你的修复,我得到了正确的、想要的结果。
  • 很高兴它有帮助。将我的评论移至答案,因为这是您要查找的内容。

标签: python dictionary append


【解决方案1】:

问题出在示例代码的第 9 行 - 在 for line... 循环的每次迭代中,您都将 errdict 重新初始化为空字典。您想在该循环的顶部初始化它,而不是在示例代码的第 3 行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    相关资源
    最近更新 更多