Python将list添加到字典类型的值错误:unshable type:“list”

2024-05-16 00:46:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图比较两个文件,然后将最终结果写入字典“dns_dic”,得到以下错误:

下面是我使用的脚本:

g  = open('/data/data/A.1/ap2014-2dom.txt','r')
f = open('/data/data/A.1/test','r')

dns_dic=defaultdict(set)
d = defaultdict(set)
psl = PublicSuffixList()

for line in g:
    line = line.strip('\n')
    domain,bl_date= line.split('|')
    bl_date = int(bl_date)
    if domain in d:
        d[domain].add(bl_date)
    else:
        d[domain] = set([bl_date])

for n, line in enumerate(f):

    line = line.strip('')
    try:
        jdata = json.loads(line)
        dom = psl.get_public_suffix(jdata.get('rrname'))
    except:
        pass
    if dom in d:
        if dom not in dns_dic:
            for i in d[domain]:
                if jdata.get('time_first') <= i <= jdata.get('time_last'):
                    ip = jdata.get('rdata') # ip one or more ips in a list 
                    if dom in dns_dic:
                        dns_dic[dom].add(ip)
                    else:
                        dns_dic[dom] = set(ip)

print dns_dic

这是g的样子:

^{pr2}$

这就是f的样子:

{"rrname":"c.000a.biz.","time_last":1400243400,"time_first":1388645949,"rdata":["50.21.180.100"]}
{"rrname":"c.000a.biz.","time_last":1389133600,"time_first":1389133600,"rdata":["50.21.180.100"]}
{"rrname": "0001211.com.","time_last":1407101755,"time_first":1389074193,"rdata":["50.21.180.100"]}

有人知道我为什么会犯这个错误吗?我想这是因为我正在将ip列表(rdata)添加到dns中,但我不确定,也找不到解决方案。在


Tags: inipdatagetdateiftimedns
1条回答
网友
1楼 · 发布于 2024-05-16 00:46:03

您正在尝试将列表放入您的集合中:

dns_dic[dom].add(ip)

ip是这里的一个列表;它取自jdata

^{pr2}$

其中定义为列表:

"rdata":["50.21.180.100"]

集合的内容必须是散列的,而列表则不是。在

您可能希望使用^{}来添加该列表的所有元素

dns_dic[dom].update(ip)

将变量重命名为ips(复数)会更好地反映它是一个列表。在

您已经在为dns_dic使用defaultdict(set)对象,因此不需要测试dom in dns_dic;您可以始终使用update()

if jdata.get('time_first') <= i <= jdata.get('time_last'):
    dns_dic[dom].update(jdata.get('rdata', []))

如果要实际构建这样一个集合,则需要删除以下行:

if dom not in dns_dic:

这意味着您将忽略该域中的更多条目。在

这就是你的第二个循环:

for n, line in enumerate(f):
    line = line.strip('')
    try:
        jdata = json.loads(line)
    except ValueError:
        continue  # ignore invalid or empty lines
    dom = psl.get_public_suffix(jdata.get('rrname'))
    for i in d.get(domain, []):
        if jdata['time_first'] <= i <= jdata['time_last']:
            dns_dic[dom].update(jdata['rdata'])

相关问题 更多 >