2015-10-07 31 views
1

我有這個文件:Python:如何添加兩個列表中沒有與該鍵的值相同的鍵的重複值?

domain|nsservers 
virus.am.|['ns101.yourhostservice.com.', 'ns102.yourhostservice.com.'] 
rochemme.ae.|['auhans1.ecompany.ae.', 'auhans2.ecompany.ae.', 'dxbans1.ecompany.ae.', 'dxbans2.ecompany.ae.'] 
virus.am.|['ns101.yourhostservice.com.', 'ns102.yourhostservice.com.','ns103.yourhostservice.com.'] 
rochemme.ae.|['auhans2221.ecompany.ae.'] 

我想使用這種格式製作的新文件。

domain|list of all unique nsservers 
virus.am.|['ns101.yourhostservice.com.', 'ns102.yourhostservice.com.','ns103.yourhostservice.com.'] 
rochemme.ae.|['auhans1.ecompany.ae.', 'auhans2.ecompany.ae.', 'dxbans1.ecompany.ae.', 'dxbans2.ecompany.ae.','auhans2221.ecompany.ae.'] 

這是我使用的代碼。但它並沒有給我結果,我想:

from collections import defaultdict 


file = './test' 
dns_dic = defaultdict(set) 

f = open(file,'r') 
for line in f: 
    line = line.strip() 
    domain,nslist = line.split('|') 
    if domain in dns_dic: 
     dns_dic[domain].append(nslist) 
    else: 
     dns_dic[domain] = (nslist) 
print(dns_dic) 

我怎麼能這些列表合併到一個獨特的valie的關鍵任何人可以幫助我(在這種情況下,域名?)?

+0

您的問題將被關閉,因爲您沒有提供任何代碼 – The6thSense

+0

@Vignesh Kalai Ju st補充! – UserYmY

回答

2

當你創建一個defaultdict像 -

dns_dic = defaultdict(set) 

這意味着set()將作爲默認值未在字典中的一個關鍵。但這並不意味着您的字典中直接包含的值(使用 - dns_dic[domain] = (nslist))將被轉換爲set)。當您直接設置字符串/列表時,不會發生此類轉換。

另一件事是你正在使用defaultdict,這樣你就不必檢查密鑰是否已經存在,等等。但你仍然在做檢查 - if domain in dns_dic:。你不需要那個。

另一個問題 -

  1. nslist是一個字符串(不是列表),因此它不具有任何.append()方法,因此這應該示數爲你 - dns_dic[domain].append(nslist)

您應該使用defaultdict默認情況下創建set而不是直接賦值。只有這樣你才能將數據集作爲值。爲此,您可以執行以下操作 - dns_dic[domain].update(nslist)

而且,在將字符串添加到字典/集之前,您應該使用ast.literal_eval將字符串轉換爲list

此外,你應該使用with語句來打開該文件(這樣處理會自動關閉該文件爲你

示例 -

from collections import defaultdict 
import ast 

file = './test' 
dns_dic = defaultdict(set) 

with open(file,'r') as f: 
    for line in f: 
     line = line.strip() 
     domain,nslist = line.split('|') 
     nslist = ast.literal_eval(nslist) 
     dns_dic[domain].update(nslist) 

print(dns_dic) 

在這之後你可以打開一個文件,並寫入例如 -

with open('filetowrite','w') as of: 
    for k,v in dns_dic.items(): 
     of.write('{}|{}'.format(k,v)) 
相關問題