如何在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
答
为什么不从集合使用计数器类获取计数?它应该快得多。 所以,你可以创建空计数器对象:
c = Counter()
,然后与新读取文件中的数据进行更新。 如果文件不是很大,我会建议你使用“readlines”方法嘲笑它们,然后使用list comprehensions一次处理所有行。
谢谢@haraprasadj。但通过这种方式,这些域名将不再是唯一的。所以确实独特的ips问题将得到解决,但我也计算同一个域的ips数量,这是我想避免的。我只需要列出ips和他们关联的唯一域的数量。你有什么进一步的建议吗? – UserYmY 2014-10-20 09:59:07
忘记了这个要求,现在增加了一张支票 – haraprasadj 2014-10-20 10:07:29
这就回答了我的问题。谢谢 – UserYmY 2014-10-20 10:50:36