Python: 如何添加两个没有重复值的列表,相同的键作为该键的值?
Python: How to add two lists with no duplicate values for the same key as a value of that key?
我有这个文件:
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)
我如何将这些列表组合成一个唯一的密钥值(在本例中是域名?)有人可以帮助我吗?
当你创建一个 defaultdict
比如 -
dns_dic = defaultdict(set)
这意味着 set()
将用作字典中未找到的键的默认值。但这并不意味着您直接包含在字典中的值(使用 - dns_dic[domain] = (nslist)
)将转换为 set
) 。当您直接为其设置 string/list 时,不会发生此类转换。
另一件事是你正在使用 defaultdict
这样你就不必检查密钥是否已经存在等等。但是你仍然在做那个检查 - if domain in dns_dic:
。你不需要那个。
另一个问题-
nslist
是一个字符串(不是列表),因此它没有任何 .append()
方法,因此这对您来说应该是错误的 - dns_dic[domain].append(nslist)
.
您应该利用 defaultdict
的能力来默认创建 set
而不是直接赋值。只有这样你才能得到集合作为值。为此,您可以执行类似 - dns_dic[domain].update(nslist)
并且在将字符串添加到 dictionary/set 之前,您应该使用 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))
我有这个文件:
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)
我如何将这些列表组合成一个唯一的密钥值(在本例中是域名?)有人可以帮助我吗?
当你创建一个 defaultdict
比如 -
dns_dic = defaultdict(set)
这意味着 set()
将用作字典中未找到的键的默认值。但这并不意味着您直接包含在字典中的值(使用 - dns_dic[domain] = (nslist)
)将转换为 set
) 。当您直接为其设置 string/list 时,不会发生此类转换。
另一件事是你正在使用 defaultdict
这样你就不必检查密钥是否已经存在等等。但是你仍然在做那个检查 - if domain in dns_dic:
。你不需要那个。
另一个问题-
nslist
是一个字符串(不是列表),因此它没有任何.append()
方法,因此这对您来说应该是错误的 -dns_dic[domain].append(nslist)
.
您应该利用 defaultdict
的能力来默认创建 set
而不是直接赋值。只有这样你才能得到集合作为值。为此,您可以执行类似 - dns_dic[domain].update(nslist)
并且在将字符串添加到 dictionary/set 之前,您应该使用 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))