Как использовать разделение на пробелы и таблицы? - PullRequest
1 голос
/ 15 марта 2020

Я сейчас пытаюсь создать игру для своего класса программирования. Однако я не могу понять, как разбить следующую последовательность строк:

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

После того, как я разбил это, у меня остался список, но у меня возникли проблемы с его использованием.

['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']

В идеале, я хотел бы превратить этот список в словарь, но как выбрать map , hubs и peaks в качестве ключей? Я знаю, что мой вопрос может быть глупым, но я застрял и мог бы действительно помочь :) Спасибо! (мы не можем импортировать любые модули, кроме математических, случайных, ..)

Ответы [ 3 ]

2 голосов
/ 15 марта 2020

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

lines = """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""".split("\n")

# with open('plateau.txt','r') as f:
#     lines = f.read().split("\n")

d = dict()
currentKey = None
for line in lines:
    if ":" in line:
        currentKey    = line.strip(":")
        d[currentKey] = []
    else:
        d[currentKey].append(tuple(line.split(" ")))

результат:

print(d)

{
   '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')]
}
0 голосов
/ 15 марта 2020

Предполагая, что вы читаете эту строку построчно из файла, вы можете просто проверить, заканчивается ли строка символом :, чтобы определить, является ли это ключом или значением.

Когда вы видите новый ключ, добавьте его в 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)]}

Я представляю это то, что вы имели в виду, или, по крайней мере, близко к этому.

0 голосов
/ 15 марта 2020

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

string1 = 'This is for an example'

list_of_string1 = string1.split(' ')

, поэтому теперь строковая переменная list_of установлена ​​['This', 'is', 'for', 'an', 'example.']

Обратите внимание, что '.' все еще там, когда вы разделены пробелом или ''. Я надеюсь, вы понимаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...