关联文件中的两行连续数据
我有一个文本文件,里面有很多重复的行,像这样:
Host: http://de.wikipedia.org Referer: http://www.wikipedia.org Host: answers.yahoo.com/ Referer: http://www.yahoo.com Host: http://de.wikipedia.org Referer: http://www.wikipedia.org Host: http://maps.yahoo.com/ Referer: http://www.yahoo.com Host: http://pt.wikipedia.org Referer: http://www.wikipedia.org Host: answers.yahoo.com/ Referer: http://www.yahoo.com Host: mail.yahoo.com Referer: http://www.yahoo.com Host: http://fr.wikipedia.org Referer: http://www.wikipedia.org Host: mail.yahoo.com Referer: http://www.yahoo.com
我正在用这段代码来处理这些行,想看看有多少个主机是通过同一个来源访问的:
dd = {}
for line in open('hosts.txt'):
if line.startswith('Host'):
host = line.split(':')[1].strip('\n')
elif line.startswith('Referer'):
referer = line.split(': ')[1].strip('\n')
dd.setdefault(referer, [0 , host])
dd[referer][0] += 1
print dd
比如说,从wikipedia.org访问了多少个链接或域名。
我只想要每个来源的第一次出现,对于属于这个来源的主机,我想要它们的总数,但要忽略已经被计算过的主机。也就是说,每当来源和主机相同且已经被计算过时,我希望它们被忽略。我想要的结果是把来源作为键,唯一主机的总和作为值,像下面这样:
{'http://www.wikipedia.org': 3 , 'www.yahoo.com' : 2}
我代码的问题在于,它把同一个来源的所有重复主机都加起来了,因为我不知道怎么把主机和来源的行关联起来。所以,如果有任何提示或帮助,我会非常感激。
1 个回答
2
你可以为每个来源网站在字典里创建一个集合,而不仅仅是用一个数字来表示。这样的话,你只需要把每个主机添加到这个集合里,重复的主机会自动被去掉。要获取某个来源网站的主机数量,只需要查看集合里的元素数量就可以了。
dd = {}
referrer = None
for line in open('hosts.txt'):
if line.startswith('Host'):
host = line.split(': ')[1].strip('\n')
elif line.startswith('Referer'):
referrer = line.split(': ')[1].strip('\n')
if referrer is not None:
dd.setdefault(referrer, set()).add(host)
referrer = None
for k, v in dd.iteritems():
print k, len(v)