Как мне в готовый словарь добавить ключи и значения из двух списков?

Для первого файла у меня словарь так отображается:

[n1]
[x1,y1]
{n1:[x1,y1]}

Для второго файла вывел необходимые списки:

[name1,name2,name3]
[datax1,datay1,datalac1,datax2,datay2,datalac2,datax3,datay3,datalac3]

Как мне добавить данные в словарь в таком виде:

{n1:[x1,y1], name1:[datax1,datay1,datalac1], name2:[datax2,datay2,datalac2], name3:[datax3,datay3,datalac3]}

Вот весь код:

import re
#1 перечислить список команд, которые может выполнить программа:
repeat="y"
listcmd=['Заполненние новых БС Nokia (1)', 'Заполненние довесов БС Nokia (2)', 'Заполненние довесов БС Ericsson (3)']
listname=[]
listxy=[]
listallname=[]
listall=[]
#7 Создать словарь и собрать данные: key - ИМЯ БС, value - Координаты, TAC, BSC:
datasites = dict()
#2 Создать пустой файл, который будет очищать при первом запуске и дублировать в дальнейшем информацию из консоли программы:
with open("output.txt", "w") as outfile:
    outfile.write("") 
while repeat == "y":
    print("Выполните действия, которые необходимо выполнить в CES:")
    print(listcmd)
    choicecmd = input()
    #print(choicecmd)
    if choicecmd == '1':
        print("Добавьте файлы формата kml в папке где находится программа для дальнейшей обработки данных.")
        #3 Вывести всю информацию одной БС из файла kml:
        with open("Site_IR000478_1.kml","r", encoding="utf8") as rdbfile:
            file = rdbfile.read()
        #print(file)
        #4 В двух файлах название БС, координаты, LAC и BSC отображаются в одном атрибуте Placemark. Нужно вывести всю информацию внутри атрибута Placemark:
        Placemark = re.findall(r'<Placemark>(.*?)</Placemark>', file, re.DOTALL)
        for i in Placemark:
            #print(i)
            #5 Написать код, который выводит Имя БС в каждом фрагменте Placemark, выводит его в нужном формате и добавить в пустой список:
            listbs = re.findall(r'<name>(.*?)</name>', i, re.DOTALL)
            #print(listbs)
            for bs in listbs:
                if '/' in bs:
                    bs = bs.split('/')[0]
                    i1 = 2
                    i2 = 3
                    bs = bs[:i1] + bs[i2+1:]
                    listname.append(bs)
                    #print(bs)
                    with open("output.txt", "a") as outfile:
                        outfile.write(bs + "\n")
                else:
                    #print("Имя базой станции другого формата!")
                    with open("output.txt", "a") as outfile:
                        outfile.write("Имя базой станции другого формата!\n")
            #6 Написать код, который выводит координаты в каждом фрагменте Placemark и выводит его в нужном формате и добавить в пустой список:
            listcoords = re.findall(r'<coordinates>(.*?)</coordinates>', i, re.DOTALL)
            #print(listcoords)
            for coords in listcoords:
                #print(coords)
                longitude = coords.split(',')[0]
                latitude = coords.split(',')[1]
                #print(longitude + " " + latitude + "\n")
                with open("output.txt", "a") as outfile:
                    outfile.write(longitude + " " + latitude + "\n")
                listxy.append(longitude)
                listxy.append(latitude)
        #print(listname)
        #print(listxy)
        #7
        #datasites["test1"]="test2" 
        datasites[listname[0]]=listxy
        print(datasites)
        #8 Собрать данные для второго файла, в котором есть Bsc и Lac:
        with open("IR.kml","r", encoding="utf8") as rdbfile:
            file = rdbfile.read()
        #print(file)
        Placemark = re.findall(r'<Placemark>(.*?)</Placemark>', file, re.DOTALL)
        for i in Placemark:
            #print(i)
            #if '<longitude>' and 'LAC' in i:
            if ('<longitude>' in i) and ('LAC' in i) and ('BSC: ' in i):
                listbs = re.findall(r'<name>(.*?)</name>', i, re.DOTALL)
                #print(listbs)
                for bs in listbs:
                    if (len(bs)==6) == True:
                        #print(bs)
                        listallname.append(bs)
                        with open("output.txt", "a") as outfile:
                            outfile.write(bs + "\n")                           
                    else:
                        #print("Имя базой станции другого формата!")
                        with open("output.txt", "a") as outfile:
                            outfile.write("Имя базой станции другого формата!\n")
                listcoords = re.findall(r'<longitude>(.*?)</latitude>', i, re.DOTALL)
                #print(listcoords)
                for coords in listcoords:
                    #print(coords)
                    coordinates = coords.split('</longitude>\n   <latitude>')
                    #print(coordinates)
                    longitude = coordinates[0]
                    latitude = coordinates[1]
                    #print(longitude + " " + latitude + "\n")
                    with open("output.txt", "a") as outfile:
                        outfile.write(longitude + " " + latitude + "\n")
                    listall.append(longitude)
                    listall.append(latitude)
                listbsctac = re.findall(r'<description>BSC: (.*?)</description>', i, re.DOTALL)
                #print(listbsctac)
                for data in listbsctac:
                    #print(data)
                    datas = data.split(' LAC: ')
                    #print(datas)
                    bsc = datas[0]
                    lac = datas[1]
                    #print(bsc + " " + lac + "\n")
                    with open("output.txt", "a") as outfile:
                        outfile.write(bsc + " " + lac + "\n")
                    listall.append(bsc)
                    listall.append(lac)
                #9 Добавить в словарь данные загруженные из второго файла:
                for o in listallname:
                    for p in listall:
                        datasites[o]=p
            else:
                #print("Координаты отсутсвуют!")
                #with open("output.txt", "a") as outfile:
                #   outfile.write("Координаты отсутсвуют!\n")
                break               
        #print(listallname)
        #print(listall)
        print(datasites)
    elif choicecmd == '2':
        print("Ты выбрал Заполненние довесов БС Nokia")
        with open("output.txt", "a") as outfile:
            outfile.write("Ты выбрал Заполненние довесов БС Nokia"+"\n")
    elif choicecmd == '3':
        print("Ты выбрал Заполненние довесов БС Ericsson")
        with open("output.txt", "a") as outfile:
            outfile.write("Ты выбрал Заполненние довесов БС Ericsson"+"\n")
    repeat = input("Do you want to continue? (y/n): ")
    if repeat == "n":
        break

в 9 пункте я пробовал реализовать это. но выводит не то что нужно. в дальнейшем мне понадобится данные из ключа сравнивать с последующими ключами. То есть n1 координаты x1,y1 сравнить с name1 - datax1,datay1.


Ответы (1 шт):

Автор решения: Иван Воронов

В дебри кода лезть не стал, но в данной задаче можно использовать вот такое:

Это входные данные, которые я использовал(пришлось записать переменные как строки, т.к. у меня их нет):

d1 = {"n1":["x1","y1"]}
l1 = ["name1","name2","name3"]
l2 = ["datax1","datay1","datalac1","datax2","datay2","datalac2","datax3","datay3","datalac3"]

Это код, используемый для преобразования:

for i in range(len(l1)):
    d1[l1[i]] = [l2[y] for y in range(3*i,3*i + 3)]
print(d1)
#{'n1': ['x1', 'y1'], 'name1': ['datax1', 'datay1', 'datalac1'], 'name2': ['datax2', 'datay2', 'datalac2'], 'name3': ['datax3', 'datay3', 'datalac3']}

P.S

Он подойдёт, если список фиксированный и меняются только значения переменных. В ситуации, когда количество имён не фиксировано, но известно, что к каждому имени относится одинаковое количество элементов списка(отсортированного, как здесь) можно использовать более общий код:

k = (len(l2)//len(l1))
for i in range(len(l1)):
    d1[l1[i]] = [l2[y] for y in range(k*i,k*i+k)]
print(d1)
→ Ссылка