列为python dict元素(添加和更新)

时间:2018-02-01 10:29:01

标签: python dictionary

我对此任务感到困惑。这是问题所在:我需要检查所有ip属于某些域,然后将dict放入具有共享一个IP的域中。所以这是我写的代码:

def check_ip(domain):     
    ip = socket.gethostbyname(domain)
    return ip

def worker_function(input_queue, output_queue):
    global list_unvalid, list_valid, ips_domains 

    while True:
        try:
            data = input_queue.get_nowait()
        except queue.Empty:
            break
        parts = re.findall('http(s)*://(.+?)/(.+)$', data)
        domain = parts[0][1]
        print("checking " + domain)
        try:
            ip = check_ip(domain)             
            with mylock:           
                ips_domains[ip].append(domain)                  
            #output_queue.put_nowait(data)
        except Exception as e:
            print('Exception ' + str(e))

        input_queue.task_done()

但我每次都有一个例外“这里有'异常'ip'”。我认为语法有问题,它会将值附加到dict。我究竟做错了什么?谢谢。

2 个答案:

答案 0 :(得分:1)

问题出在

ips_domains[ip].append(domain)

由于ips_domains是一个空字典,ips_domains[ip]不是列表对象,您无法在其上调用.append()。如果您在需要将dict条目初始化为空列表之前没有看到过ip:

if not ip in ips_domains:
    ips_domains[ip]=[]
ips_domains[ip].append(domain)

答案 1 :(得分:1)

第一次尝试将域添加到ip时,没有可以添加域的列表。对于每个ip,您必须首先初始化一个空列表。

如果您将dict更改为ips_domains = defaultdict(list),则第一次尝试将域添加到ip时会在字典中添加一个空列表。

https://docs.python.org/2/library/collections.html#collections.defaultdict

例如:

>>> a=dict()
>>> a["key"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'key'
>>> from collections import defaultdict
>>> b=defaultdict(list)
>>> b["key"]
[]
>>> b
defaultdict(<class 'list'>, {'key': []})
>>>