我正在从具有重复值的文件创建一个dict。如何防止循环覆盖现有值?

时间:2016-11-18 18:04:00

标签: python loops dictionary text

我对python脚本感到非常头疼。

它基本上加载了像txt文件这样的DNS区域,如下所示:

name.com 3600 MX ns1.google.com
name1    3600 A  1.2.3.4

我正在将此文件加载到python中,循环遍历每一行并将每一行转换为列表,因此上述数据将如下所示:

[["name.com", "3600", "MX", "ns1.google.com"],["name1","3600","A","1.2.3.4"]] etc

然后我需要获取每个列表并将数据位分配给dict,如下所示:

for each_list in data:
     terrarecord[each_list[0].replace('.', '') + str(self.random)] = {
                "zone_id": self.zone_id,
                "name": each_list[0] + self.url, 
                "type": each_list[2],
                "ttl": each_list[1],
                "records": [each_list[3].replace('\n', '')]
            }

对于上面的示例文本文件都很好和花花公子。但是,如果我有一个带有重复条目的区域文件,如下面所示,这个循环正在写入它们,造成各种各样的破坏。

name.com 3600 MX ns1.google.com
name1    3600 A  1.2.3.4
name1    2000 A  1.2.2.2 # <--- this will overwritten

如何编写此循环以便每次创建一个新的dict对象而不是在现有字典上写入?

1 个答案:

答案 0 :(得分:1)

最容易想到的事情是使用defualtdictlist。像这样:

from collections import defaultdict
...
terrarecord = defaultdict(list)
...
terrarecord[each_list[0].replace('.', '') + str(self.random)].append({
            "zone_id": self.zone_id,
            "name": each_list[0] + self.url, 
            "type": each_list[2],
            "ttl": each_list[1],
            "records": [each_list[3].replace('\n', '')]
        })

结果将是每个键将与值列表相关联,其顺序与输入的顺序相同。如果您需要专门的常规字典,您可以随时将其转换回来:

terrarecord = dict(terrarecord)