关联文件中的两行连续数据

0 投票
1 回答
637 浏览
提问于 2025-04-16 05:32

我有一个文本文件,里面有很多重复的行,像这样:

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)

撰写回答