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:, Вам это не нужно.

Еще одна проблема -

  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))
Другие вопросы по тегам