2014-10-20 62 views
0

對不起,如果問題似乎與以前的問題類似,但我找不到任何相關的答案,我的確切問題。如何在python字典中獲取唯一鍵和唯一值列表?

我在一個目錄中有一組文本文件,我想將它們全部讀取並解析它們。該文件的格式是這樣的(這意味着該文件有一個域重複的IP和一個IP重複域,而且還反覆對域| IP):

file 1: domain|ip 
    yahoo.com|9.9.9.9 
    mard.man.net|23.34.5.1 
    bbc.net|86.45.76.5 


file 2: 
    google.com|9.9.9.9 
    yahoo.com|9.9.9.9 
    yahoo.com|23.34.5.1 

什麼,我要的是一個字典,顯示獨特的ips及其相關的唯一域名,如下所示:

9.9.9.9,2 
23.34.5.1,2 
86.45.76.5,1 

這是我爲它編寫的腳本。

d = defaultdict(set) 

for dirpath, dirs, files in os.walk(path): 
    for filename in fnmatch.filter(files, '*.*'): 
     with open(os.path.join(dirpath, filename)) as f: 
      for line in f: 
       if line.startswith('.'): 
        domain = line.split('|')[0] 
        ip = line.split('|')[1].strip('\n') 
        d[ip].add(domain) 

但問題是,因爲腳本是在幾個文本文件運行時,如果一個IP(鍵)已經被寫入一次從一個文本文件中的字典(d),然後在另一個文本再次出現文件,該字典將與新的價值類似的事情再次把它寫:

9.9.9.9,1 
23.34.5.1,1 
86.45.76.5,1 
9.9.9.9,2 
23.34.5.1,2 

回答

2

我認爲更好的辦法是使用它,而不是拍攝中遇到的最後一個域到每個IP地址鏈接到域列表。

像:

if ip in d: 
    if domain not in d[ip]: 
    d[ip].append(domain) 
else: 
    d[ip] = [domain] 

現在,您可以通過使用

len(d[ip]) 

對於任何給定的IP

+0

謝謝@haraprasadj。但通過這種方式,這些域名將不再是唯一的。所以確實獨特的ips問題將得到解決,但我也計算同一個域的ips數量,這是我想避免的。我只需要列出ips和他們關聯的唯一域的數量。你有什麼進一步的建議嗎? – UserYmY 2014-10-20 09:59:07

+0

忘記了這個要求,現在增加了一張支票 – haraprasadj 2014-10-20 10:07:29

+0

這就回答了我的問題。謝謝 – UserYmY 2014-10-20 10:50:36

1

爲什麼不從集合使用計數器類獲取計數?它應該快得多。 所以,你可以創建空計數器對象:

c = Counter() 

,然後與新讀取文件中的數據進行更新。 如果文件不是很大,我會建議你使用「readlines」方法嘲笑它們,然後使用list comprehensions一次處理所有行。