2010-10-15 20 views
0

我有重複行這樣的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 

egfrom wikipedia.org,有多少鏈接或域已被訪問。

我只想要第一次出現任何引用者,並且對於屬於該引用者的主機,我想要所有這些引用的總和,忽略已經爲相同引用者計數的主機,所以基本上每當引用者主機是相同的,他們已經被計算在內,我希望他們被忽略,將「引用者」作爲鍵值和唯一主機的總和作爲值,如下所示:

{'http:// www。 wikipedia.org':3,'www.yahoo.com':2}

我的代碼存在的問題是,它將所有重複主機總計爲同一個引用者,因爲我無法弄清楚如何關聯主機和Referer行。所以,任何暗示或幫助是高度讚賞。

+0

這是否始終是一個主機行之後是一個Referer系列,或者是否曾經存在過主機後跟多個推薦人? – amadain 2010-10-15 10:34:06

回答

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) 
+1

你可以刪除'如果referrer不在dd'部分,並按照'dd.setdefault(referrer,set()).add(host)'的方式進行操作。另一個更清晰的選項是將'dd'設爲'collections.defaultdict'。 – EOL 2010-10-15 12:59:05

+0

是的,我試圖找出'setdefault',但我想我會堅持我所知道的。 'collections.defaultdict'絕對超出了我所知道的範圍,但是謝謝你的建議! – 2010-10-15 13:04:24