【问题标题】:How to get unique keys and list of unique values in python dictionary?如何在python字典中获取唯一键和唯一值列表?
【发布时间】:2014-10-20 09:33:46
【问题描述】:

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

我在一个目录中有一组文本文件,我想全部阅读并解析它们。文件的格式是这样的(这意味着文件有一个域的重复 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

【问题讨论】:

    标签: python dictionary unique


    【解决方案1】:

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

    喜欢:

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

    现在您可以通过使用获取计数

    len(d[ip])
    

    对于任何给定的 ip

    【讨论】:

    • 谢谢@haraprasadj。但通过这种方式,域将不再是唯一的。因此,确实可以解决唯一 ips 的问题,但我也在计算具有相同域的 ips 数量,这是我想要避免的事情。我只需要 ips 列表和它们关联的唯一域的计数。您对此有什么进一步的建议吗?
    • 忘记了这个要求,现在添加了一个检查
    • 这回答了我的问题。谢谢
    【解决方案2】:

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

    c = Counter()
    

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

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2016-12-27
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多