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

问题描述:

对不起,如果问题似乎与以前的问题类似,但我找不到任何相关的答案,我的确切问题。如何在python字典中获取唯一键和唯一值列表?

我在一个目录中有一组文本文件,我想将它们全部读取并解析它们。该文件的格式是这样的(这意味着该文件有一个域重复的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(键)已经被写入一次从一个文本文件中的字典(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 

我认为更好的办法是使用它,而不是拍摄中遇到的最后一个域到每个IP地址链接到域列表。

像:

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

现在,您可以通过使用

len(d[ip]) 

对于任何给定的IP

+0

谢谢@haraprasadj。但通过这种方式,这些域名将不再是唯一的。所以确实独特的ips问题将得到解决,但我也计算同一个域的ips数量,这是我想避免的。我只需要列出ips和他们关联的唯一域的数量。你有什么进一步的建议吗? – UserYmY 2014-10-20 09:59:07

+0

忘记了这个要求,现在增加了一张支票 – haraprasadj 2014-10-20 10:07:29

+0

这就回答了我的问题。谢谢 – UserYmY 2014-10-20 10:50:36

为什么不从集合使用计数器类获取计数?它应该快得多。 所以,你可以创建空计数器对象:

c = Counter() 

,然后与新读取文件中的数据进行更新。 如果文件不是很大,我会建议你使用“readlines”方法嘲笑它们,然后使用list comprehensions一次处理所有行。