Как мне в готовый словарь добавить ключи и значения из двух списков?
Для первого файла у меня словарь так отображается:
[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)