Спасибо за советы, скрипт заработал. Только вот теперь он добавляет вообще все улицы к вообще всем районам. Видимо потому, что когда я добавляю новый элемент во вложенный словарь, я не указываю, к какому из ключей я его добавляю, поэтому все строки записываются везде.
tt[str(s_line[:-1])] = ttt
Как выбрать только те улицы, которые относятся к конкретному району? Подозреваю, что в указанной выше строке можно задать ключ вложенного словаря.
x = open("C:\\startling_experiments\\data.txt", "r")
d = x.read().split('\n')
c = [] #Сюда запишется разаобранный список
t = {} #Три уровня словарей: общий
tt = {} #по городам
ttt = {} #по районам
o = "город"
a = "ПГТ"
v = "массив"
w = "район"
m = "ул."
n = "пер."
g = "и подворотнях"
for line in d:
z = line.split(';')
f = [z[0], z[1], z[2]]
c.append(f)
for a_line in c:
if o in str(a_line) or a in str(a_line):
t[str(a_line[:-1])] = tt
for s_line in c[c.index(a_line) + 1:]:
if v in str(s_line) or w in str(s_line):
tt[str(s_line[:-1])] = ttt
for n_line in c[c.index(s_line) + 1:]:
if m in str(n_line) or n in str(n_line):
ttt[str(n_line[:-1])] = n_line[-1]
elif g in str(n_line):
ttt[str(n_line[:-1])] = n_line[-1]
elif v in str(n_line) or w in str(n_line) or o in str(n_line) or a in str(n_line):
break
elif o in str(s_line) or a in str(s_line):
break
print(t)