Python:如何为同一个键添加两个没有重复值的列表作为该键的值?

时间:2015-10-07 09:10:49

标签: python list dictionary set combiners

我有这个文件:

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)

如何将这些列表组合成一个密钥的唯一值?(在这种情况下是域名?)任​​何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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)
  2. 您应该利用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))