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)
Как я могу объединить эти списки в уникальное значение для ключа (в данном случае доменное имя?) Кто-нибудь может мне помочь?
1 ответ
Когда вы создаете defaultdict
лайк -
dns_dic = defaultdict(set)
Это означает, что set()
будет использоваться в качестве значения по умолчанию для ключа, который не найден в словаре. Но это не значит, что значения в вас непосредственно включаются в словарь (используя - dns_dic[domain] = (nslist)
) будет преобразован в set
) Такое преобразование не произойдет, если вы непосредственно установите для него строку / список.
И еще одна вещь, которую вы используете defaultdict
так что вам не нужно проверять, существует ли ключ или нет, и т. д. Но вы все равно делаете эту проверку - if domain in dns_dic:
, Вам это не нужно.
Еще одна проблема -
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))