我有一个重复行的txt文件,如下所示:
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,访问了多少链接或域名。
我只希望第一次出现任何引用者,并且对于属于该引用者的主机,我想要所有这些引用的总和,忽略已经为同一引用者计算的主机,所以基本上每当引用者和主机是相同的,它们已被计数,我希望它们被忽略,将'referrer'作为键和唯一主机的总和作为值,如下所示:
{'http://www.wikipedia.org':3,'www.yahoo.com':2}
我的代码的问题在于它为同一个引用者的所有重复主机求和,因为我无法弄清楚如何关联Host和Referer行。因此,任何提示或帮助都非常受欢迎。
答案 0 :(得分: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)