【问题标题】:Relating two consecutive lines in a file关联文件中的两个连续行
【发布时间】:2010-10-15 10:26:54
【问题描述】:

我有一个这样的重复行的 txt 文件:

主持人:http://de.wikipedia.org 参考:http://www.wikipedia.org 主持人:answers.yahoo.com/ 推荐人:http://www.yahoo.com 主持人:http://de.wikipedia.org 参考:http://www.wikipedia.org 主持人:http://maps.yahoo.com/ 推荐人:http://www.yahoo.com 主持人:http://pt.wikipedia.org 参考:http://www.wikipedia.org 主持人:answers.yahoo.com/ 推荐人:http://www.yahoo.com 主机:mail.yahoo.com 推荐人:http://www.yahoo.com 主持人:http://fr.wikipedia.org 参考:http://www.wikipedia.org 主机:mail.yahoo.com 推荐人: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}

我的代码的问题在于它汇总了同一引荐来源的所有重复主机,因为我不知道如何关联主机和引荐行。因此,非常感谢任何提示或帮助。

【问题讨论】:

  • 是否总是一个主机行后跟一个Referer行,或者是否存在主机后跟多个引荐人的情况?

标签: python


【解决方案1】:

您可以为字典中的每个引用者设置一个集合,而不仅仅是一个数字。这样,您只需将每个主机添加到集合中,重复项将被自动丢弃。要获取引用者的主机数,请获取集合中的元素数。

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)

【讨论】:

  • 您可以删除if referrer not in dd 部分并在其后面加上dd.setdefault(referrer, set()).add(host)。另一个更清晰的选择是将dd 设为collections.defaultdict
  • 是的,我试图弄清楚setdefault,但我想我会坚持我所知道的。 collections.defaultdict 绝对超出了我所知道的范围,但感谢您的建议!
猜你喜欢
  • 1970-01-01
  • 2013-05-30
  • 2021-10-02
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多