2016-04-04 3 views
-1

У меня есть файл, который идет как это:Создать Dict кортежей из файла

Лимерик

8 A

5 B

Quintain (английский)

0 А

0 B

Я хочу сделать это в таком тике:

{'Limerick': ([8, 5], ['A', 'B']), 'Quintain (English)': ([0 , 0], [ 'A', 'B'])}

до сих пор я был в состоянии получить:

{ 'Лимерик': [], 'Рондо': [], ' Haiku ': [],' Quintain (английский) ': [],' Sonnet ': []},

, но после этого я не знаю, как добавить 8 A, 5 B и т. Д. Пробовал получать индекс где они запускаются и останавливаются, но это не похоже на то, что позволяет IO Python.

Гипотетически, я пытался добавить 8 A, 5 B в список, а затем добавить 8, 5 и A, B в два списка, а затем разобрать их. Но это не представляется возможным/очень неэффективным.

Моя попытка (poem_form что мне удалось получить):

def read_poetry_form_descriptions(poetry_forms_file): 

    poem_file = open(poetry_forms_file, 'r') 
    temp_poem, poem_form = {}, {} 

    for line in poem_file: 
     temp_poem[line.strip()] =() 
     poem_form.pop('', None) 

    poem_file.close() 

    for key in temp_poem: 
     if key[0:3].isalpha(): 
      poem_form[key] = [] 

    print(poem_form) 
+1

Как вам удалось получить вашу версию? Отправьте свой код, чтобы мы могли найти любые ошибки. – Selcuk

+0

@Selcuk Добавлено мой код. –

+0

Что вы можете попробовать, так же, как вы использовали '.isaplha()', вы можете использовать '.isdigit()', чтобы получить числа в списке. –

ответ

2

Вот возможное решение вашей проблемы.

def read_poetry_from_desc(poetry_forms_file): 
    poem_form = {} 

    with open(poetry_forms_file, 'r') as f: 
     cur_header = None # latest header found in file 

     for line in f: 
      line = line.strip() 

      # Skip empty lines 
      if len(line) == 0: 
       continue 

      if line[0].isalpha(): 
       # Found new header, add empty entry to dict 
       cur_header = line 
       poem_form[cur_header] = ([], []) 

      else: 
       # Found data, record it 
       pair = line.split() # split on space 

       data = poem_form[cur_header]     
       data[0].append(int(pair[0])) 
       data[1].append(pair[1]) 

    return poem_form 

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

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

Потому что значение каждой клавиши в вашем словаре poem_form имеет формат ([], []), поэтому в словарь добавляются пустые списки, когда мы видим новую метку в файле. Мы также записываем, что в настоящее время мы накапливаем этот ярлык (cur_header).

Всякий раз, когда мы видим данные, он разбивается и накапливается в любой текущей метке (cur_label).

Для пояснения относительно with, см. Это link. Он может лучше объяснить это, чем могу. По существу, with используется, когда у вас есть блок текста, который имеет операцию с ним в начале и в конце использования. Здесь я использую его для open. Обычно вам нужно будет открыть файл и закрыть его, когда закончите. В этой функции, когда область with завершена, файл автоматически закрывается. Чтобы понять, почему это происходит, см. Связанную статью.

+0

Святой ад, который потрясающий, работает как шарм. Могу ли я обосновать это, как я никогда раньше не видел. –

+0

Это ответ без контекста к вопросу, который мог быть назначением. Как люди должны учиться? Как учитель, вы должны знать лучше. –

+1

@FerdinandvanWyk Вы правы. Я извиняюсь перед OP. – sdsmith

Смежные вопросы