关联文件中的两个连续行

时间:2010-10-15 10:26:55

标签: python

我有一个重复行的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行。因此,任何提示或帮助都非常受欢迎。

1 个答案:

答案 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)