将值附加到 Python 字典

Posted

技术标签:

【中文标题】将值附加到 Python 字典【英文标题】:appending values to Python dictionary 【发布时间】:2016-12-30 17:28:46 【问题描述】:

我有一个读取 CSV 文件的脚本 csv file

Asset IP Address,Vulnerability Title
50.103.128.11,Partition Mounting Weakness
10.103.128.11,UDP IP ID Zero
10.103.128.11,Root's umask value is unsafe
0.103.128.11,Root's umask value is unsafe
20.103.128.11,Root's umask value is unsafe
10.103.128.11,ICMP timestamp response
22.103.128.11,ICMP timestamp response
10.103.128.11,UDP IP ID Zero
10.103.129.11,Partition Mounting Weakness

在运行我的脚本之后

import csv
from pprint import pprint
#with open('test.csv', 'rb') as f:
#   reader = csv.DictReader(f, delimiter=',')
#   for row in reader:
#       print row
#dict = a:[], b:[]
dict = 
with open('test.csv', 'rb') as f:
    reader = csv.DictReader(f, delimiter=',')   
    for row in reader:
        a = row["Vulnerability Title"]
        b = [row["Asset IP Address"]]       
        #b = row(["Asset IP Address"])  
        #dict = a:[], b:[]        
        if a in dict:
        #print row["Vulnerability Title"]
        #if row["Vulnerability Title"] in dict:
            dict[a].append(b)   
        else:
            dict[a] = b
pprint(dict)

读取漏洞列表并使用具有该漏洞的 ips 创建一个字典。但是我的结果是一个带有一个额外括号的列表。想伸出手,看看有人有更好的想法或可以帮助我。 results

'ICMP timestamp response': ['10.103.128.11', ['22.103.128.11']],
 'Partition Mounting Weakness': ['50.103.128.11', ['10.103.129.11']],
 "Root's umask value is unsafe": ['10.103.128.11',
                                  ['0.103.128.11'],
                                  ['20.103.128.11']],
 'UDP IP ID Zero': ['10.103.128.11', ['10.103.128.11']]

【问题讨论】:

你不需要在b = [row["Asset IP Address"]] 中的外部[] 【参考方案1】:

您正在尝试重新发明defaultdict

from collections import defaultdict

d = defaultdict(list)
with open('test.csv', 'rb') as f:
    reader = csv.DictReader(f, delimiter=',')   
    for row in reader:
        d[row["Vulnerability Title"]].append(row["Asset IP Address"])   

pprint(d)

附带说明,dict 不是变量名的最佳选择 - 您正在隐藏 built-in dict(),请选择不同的变量名。

【讨论】:

【参考方案2】:

使用setdefault(),不要将b 设为列表,也不要使用内置函数作为变量名:

d = 
with open('test.csv', 'rb') as f:
        reader = csv.DictReader(f, delimiter=',')   
for row in reader:
    a = row["Vulnerability Title"]
    b = row["Asset IP Address"]
    d.setdefault(a, []).append(b)   

【讨论】:

您还应该注意您已经修复了b 分配。而且,有一个缩进错误(可能只是一个发布错误,但你已经复制了它)。 是的,我只是复制粘贴,谢谢指出。我看你比我快一点。

以上是关于将值附加到 Python 字典的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用while循环时将值附加到字典中的列表?

为字典中的一个键附加多个值[重复]

无法将字符串附加到字典键

我们如何在 swift 2.3 中将值附加到包含 3 个元素的字典中?

python中 列表导入到字典 出现相同的键,如何将值相加

Python - 将字典列表附加到嵌套的默认字典时出现关键错误