Как добавить строки в открытом файле перед пустой строкой в ​​словарь, а затем продолжить добавление следующих строк до следующей пустой строки? - PullRequest
0 голосов
/ 03 августа 2020

Новичок в программировании, заранее спасибо!

У меня есть текстовый файл, например:

A
B
1
2

C
D
1
2
3
4

E
F
1
2
3
4
5
6

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

{('A','B'): [[1],[2]], ('C','D'):[[1, 3], [2, 4]], ('E','F'):[[1, 3, 5],[2, 4, 6]]}

Прямо сейчас я начал свою функцию так:

while line != '':
    # rest of function to append to dictionary here

Но я понял, что это работает только до первой пустой строки. Если я попытаюсь продолжить чтение и напечатаю строки после функции, из-за природы while l oop, первая напечатанная строка будет D вместо C. Как я могу исправить это БЕЗ импортирования?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вот один из способов сделать это (при условии, что файловая структура такая, как вы сказали):

Сначала создайте строку, содержащую все строки:

lines = ''.join(list(open("test.txt")))
#'A\nB\n1\n2\n\nC\nD\n1\n2\n3\n4\n\nE\nF\n1\n2\n3\n4\n5\n6'

Затем разделите на пары :

pairs = lines.split('\n\n')
#['A\nB\n1\n2', 'C\nD\n1\n2\n3\n4', 'E\nF\n1\n2\n3\n4\n5\n6']

Наконец, внутри каждой пары разделить ключ и значение:

pairs = lines.split('\n\n')
result = {}
for pair in pairs:
    data = pair.split('\n')
    key = (data[0], data[1])
    first_value = data[2::2]
    second_value = data[3::2]
    result[key] = [first_value, second_value]
result

Вывод:

{('A', 'B'): [['1'], ['2']],
 ('C', 'D'): [['1', '3'], ['2', '4']],
 ('E', 'F'): [['1', '3', '5'], ['2', '4', '6']]}

Примечание: data[2::2] означает начало нарезки массива с позиции 2 и повторять каждые 2 элемента

0 голосов
/ 03 августа 2020

Сделайте так:

txt = x.read_text() # read file as string here
txt = txt.split('\n\n')
txt = list(map(lambda y: y.split('\n'), txt))

keys = list(map(lambda y: y[:2], txt))
values = list(map(lambda y: y[2:], txt))
d = {tuple(key): [[value[0::2]], [value[1::2]]] for key in keys for value in values}
...