Предполагая, что вы читаете эту строку построчно из файла, вы можете просто проверить, заканчивается ли строка символом :
, чтобы определить, является ли это ключом или значением.
Когда вы видите новый ключ, добавьте его в dict и установите значение в пустой список, но сохраняйте список вокруг, чтобы вы могли добавлять к нему новые значения.
Если строка не является ключом, вы можете используйте split()
на нем и используйте понимание списка, чтобы привести элементы в целые числа. Вы можете превратить их в кортежи, чтобы у вас был список кортежей для каждого ключа.
Примерно так должно работать:
result = {}
# initialize `values` to None, so you get an
# error if you see values before a key.
values = None
with open('description.txt') as f:
for line in f:
line = line.strip() # remove newline, spaces
if not line:
continue # skip blank lines
if line.endswith(':'):
# it's a key. strip the `:` and start a new list
values = []
result[line.rstrip(':')] = values
else:
values.append(tuple(int(i) for i in line.split()))
Одна часть этого кода, которая может показаться странной для новички - то, как значения волшебно добавляются к правильному ключу. Это работает, потому что список Python является объектом в памяти, поэтому сохранение его в values
и в results['peaks']
означает, что они оба указывают на один и тот же объект списка, поэтому добавление к values
правильно добавит его в список вершин.
Синтаксис понимания списка (здесь больше понимания кортежей) также может показаться сложным, но на самом деле это очень Pythoni c конструкция и что на самом деле делает Python настолько приятным в использовании, как вы можете express так кратко изложить эту сложную идею.
Запуск этого кода на ваших примерах данных дает следующий результат:
{'map': [
(39, 41)],
'hubs': [
(21, 3, 1500, 25),
(21, 38, 1500, 25)],
'peaks': [
(10, 10, 200),
(11, 10, 300),
(12, 10, 400),
(10, 11, 200),
(10, 12, 500)]}
Я представляю это то, что вы имели в виду, или, по крайней мере, близко к этому.