Как обрабатывать входные данные из текстового файла - PullRequest
0 голосов
/ 23 апреля 2019

Я новичок в Python. Чтобы практиковать это, я делаю упражнения из аббатства Код. Они часто представляют свои входные данные в виде столбцов чисел. В приведенном ниже примере я должен был вычислить сумму первых членов арифметической последовательности. Входные данные были представлены в трех столбцах:

25 12 77

27 14 95

8 0 30

...

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

Поскольку эти списки с входными данными часто бывают довольно длинными, я не хочу, чтобы они были жестко закодированы в скрипте. Поэтому я скопировал, вставил и сохранил их в виде простого текстового файла. Прежде чем я смог приступить к самому упражнению, мне пришлось пройти четыре цикла «for», чтобы преобразовать исходный текстовый файл в работающий формат (переход от строк к целым числам). Кроме того, мне пришлось создать несколько списков, в которые я добавляю последующие результаты.

После первого цикла for я получил список строк: ['25 12 77 ’, ’27 14 95’,….]

После второго цикла «for» я получил список списков строк [['25', '12', '77'], ['27', '14', '95']…]

После третьего и четвертого (вложенного) цикла «for» я наконец получил список целых чисел [25, 12, 77, 27, 14, 95…]

with open("input_progression.txt") as file:

    for line in file:
        line = line.strip()
        lines.append(line)

    for strings in lines:
        strings = strings.split(' ')
        g.append(strings)

    for sublist in g:
       for item in sublist:
           flat_list.append(item)
        flat_list = list(map(int, flat_list))

    for numbers in range(int(len(flat_list) / 3)):
        for integer in range(0, flat_list[counter + 2]):
            result += (flat_list[counter] + flat_list[counter + 1] * integer)
        outcome.append(result)
        counter += 3
        result = 0
print (outcome)

Это была довольно утомительная работа (все эти вещи были новыми для меня). Вы знаете какой-нибудь более простой (или, возможно, Pythonian) способ, как это сделать? Есть ли где-нибудь учебник, как использовать текстовые файлы в качестве ввода?

Ответы [ 4 ]

0 голосов
/ 23 апреля 2019

Вы можете использовать регулярные выражения для более простого анализа текстовых файлов.

import re
file = open("input_progression.txt", "r")
text = ""
for line in file:
  text = text + line
outcome = [int(num) for num in re.findall("[0-9]+", text)]
print(outcome)
0 голосов
/ 23 апреля 2019

Это более короткий и точный

flat_list = []
outcome = []
counter = 0
result = 0
with open("input_progression.txt") as file:
for line in file:
    line = line.strip().split(' ')
    if len(line) >= 1: flat_list.append(line) 
flat_list = [int(item) for sublist in flat_list for item in sublist]


for numbers in range(int(len(flat_list) / 3)):
    for integer in range(0, flat_list[counter + 2]):
        result += (flat_list[counter] + flat_list[counter + 1] * integer)
    outcome.append(result)
    counter += 3
    result = 0
print (outcome)
0 голосов
/ 23 апреля 2019

Вы можете использовать меньше циклов.

with open("input_progression.txt") as file:
    for line in file:
        line = line.strip()
        line = line.split(" ")
        start = int(line[0])
        incr_val = int(line[1])
        num_loops = int(line[2])
        for n in range(num_loops):
            start += incr_val #Increment
        print(start) #answer for each row
0 голосов
/ 23 апреля 2019

Попробуйте:

with open("input_progression.txt") as f:
    outcome = [int(item) for sublist in [l.split() for l in f] for item in sublist]
print(outcome)
...