如何在python字典中获取唯一键和唯一值列表?

时间:2014-10-20 09:33:47

标签: python dictionary unique

很抱歉,如果问题与以前的问题类似,但我找不到任何相关的答案来解决我的确切问题。

我在目录中有一组文本文件,我想要全部读取它们并解析它们。文件的格式是这样的(这意味着文件具有一个域的重复ip和一个ip的重复域以及重复的域| ip):

file 1:    domain|ip
    yahoo.com|9.9.9.9
    mard.man.net|23.34.5.1
    bbc.net|86.45.76.5


file 2:
    google.com|9.9.9.9
    yahoo.com|9.9.9.9
    yahoo.com|23.34.5.1

我想要的是一个字典,它显示了独特的ips及其相关的独特域名数量,如下所示:

9.9.9.9,2
23.34.5.1,2
86.45.76.5,1

这是我为它写的脚本。

d = defaultdict(set)

for dirpath, dirs, files in os.walk(path):
    for filename in fnmatch.filter(files, '*.*'):
        with open(os.path.join(dirpath, filename)) as f:
            for line in f:
               if line.startswith('.'):
                    domain = line.split('|')[0]
                    ip = line.split('|')[1].strip('\n')
                    d[ip].add(domain)

但问题是,由于脚本在几个文本文件上运行,如果ip(key)已从一个文本文件一次写入字典(d),然后再次出现在另一个文本文件中,则字典会用新的值再写一次:

9.9.9.9,1
23.34.5.1,1
86.45.76.5,1
9.9.9.9,2
23.34.5.1,2

2 个答案:

答案 0 :(得分:2)

我认为更好的方法是使用它将每个IP地址链接到域列表,而不是捕获遇到的最后一个域。

像:

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

现在您可以使用

获取计数
len(d[ip])

任何给定的ip

答案 1 :(得分:1)

为什么不从集合中使用Counter类?它应该快得多。 所以你可以创建空的反对象:

c = Counter()

然后用新读取的文件中的数据更新它。 如果文件不是很大,我建议你使用" readlines"方法,然后使用列表推导一次处理所有行。