将List作为值添加到Dict中的问题?

时间:2014-04-16 06:49:05

标签: python list dictionary

我在下面的代码的第二部分中遇到问题。该文件包含"Veth""Po""Eth"的重复条目。如:

23       0050.5681.6e60    dynamic   10         F    F  Veth1300

23       0050.5681.6e60    dynamic   10         F    F  Veth1400

23       0050.5681.6e60    dynamic   10         F    F  Veth1500

我的全部想法是使用MAC("0050.5681.6e60")作为唯一键,并将接口("Veth1300")匹配并捕获到列表中作为MAC的值。类似的东西:

0050.5681.6e60 : [Veth1300, Veth1400, Veth1500]

出于某种原因,我在第二部分中的代码没有实现目标。第一部分中我的正则表达式部分正在按预期工作。我一直收到这个错误:

Traceback (most recent call last):

File "C:\Python27\Mastin_Veth.py", line 24, in <module>

if dict1[mac] != None:

KeyError: '0050.5681.6e60'

有人可以帮助诊断问题。 (下面的代码缩进是错误的,因为无法发布代码)

import re
MAC_keys = set()
dict1    = dict()
#Part I
with open('C:/Python27/dup_MAC_SR629930635.csv') as f:
    for line in f:
        regex = re.compile(r"\*\s*[0-9]{1,}\s*([0-9a-z]{4}.[0-9a-z]{4}.[0-9a-z]{4}).*(Veth\d+|Eth.*|Po\d+)$",re.IGNORECASE|re.DOTALL)
        r = regex.search(line)
        MAC_Key,MAC_associated_VETH = r.groups()
        MAC_keys.add(MAC_Key)

#Part II
for mac in MAC_keys:              # Iteration over SET of Keys
    with open('C:/Python27/dup_MAC_SR629930635.csv') as f:
        for line in f:
            regex = re.compile(r"\*\s*[0-9]{1,}\s*([0-9a-z]{4}.[0-9a-z]{4}.[0-9a-z]{4}).*(Veth\d+|Eth.*|Po\d+)$",re.IGNORECASE|re.DOTALL)
            r = regex.search(line)
            MAC_Key,MAC_associated_VETH = r.groups()
            if mac == MAC_Key:
                #get the value associated with the key
                if dict1[mac] != None:
                    tmp_values_list = list(dict1[mac])
                    tmp_values_list.append(MAC_associated_VETH)
                    dict1.update({mac:tmp_values_list })
                elif dict1[mac] == None:
                    tmp_values_list = [MAC_associated_VETH]
                    dict1[mac] = tmp_values_list

1 个答案:

答案 0 :(得分:0)

您将第I部分中的键添加到集MAC_Keys,但它们不在dict1中;它仍然是一个空字典,因此在KeyErrordict1[mac]

您可以使用dict1.get(mac),如果密钥不存在,返回None。此外,您应该真正检查Noneis not None,而不是!= None,而elif是没有意义的 - 它是None或者它不是,只是放else

然而,这似乎是一种过于复杂的做事方式。每次迭代集合中的键和整个文件都是低效的,特别是考虑到你可以检查if MAC_Key in MAC_Keys:。此外,使用tmp_values_listupdate是一个很长的路,你可以直接appenddict1[mac]

相反,我建议:

from collections import defaultdict

out = defaultdict(list)

with open(...) as f:
    for line in f:
        parts = line.strip().split()
        out[parts[1]].append(parts[6])

这可以在一次传递中完成所有操作,而无需正则表达式。即使您保留正则表达式,单个循环和defaultdict也会使您的代码更清晰,更易于编写和维护。

相关问题