2016-10-16 5 views
0

У меня есть текст, который я хочу преобразовать в словарь.Как создать плоский словарь в python

Вот формат текста:

Apple 0 
orange 5: 
text1 : random text 
text2 : random text 
text3 : random text 
text4 : random text 
orange 6: 
text1 : random text 
text2 : random text 
text3 : random text 
text4 : random text 

Apple 1 
orange 12: 
text1 : random text 
text2 : random text 
text3 : random text 
text4 : random text 
orange 13: 
text1 : random text 
text2 : random text 
text3 : random text 
text4 : random text 

Я хочу, чтобы преобразовать словарь что-то вроде этого:

dic_text = {'apple-0-orange-5-text1' : 'random text','apple-0-orange-5-text2' : 'random text','apple-0-orange-5-text3' : 'random text','apple-0-orange-5-text4' : 'random text','apple-0-orange-6-text1' : 'random text','apple-0-orange-6-text2' : 'random text','apple-0-orange-6-text3' : 'random text','apple-0-orange-6-text4' : 'random text','apple-1-orange-12-text1' : 'random text','apple-1-orange-12-text2' : 'random text','apple-1-orange-12-text3' : 'random text','apple-1-orange-12-text4' : 'random text','apple-1-orange-13-text1' : 'random text','apple-1-orange-13-text2' : 'random text','apple-1-orange-13-text3' : 'random text','apple-1-orange-13-text4' : 'random text'} 

Может кто-нибудь сказать мне общий способ сделать словарь что-то вроде выше? Действительно оценил бы быстрый ответ. Заранее большое спасибо.

+0

Все товары находятся на одной линии? Таким образом, вы можете просто повторить и не забудьте получить первую строку, содержащую «яблоко 0», затем «оранжевые x» и, наконец, «textX: random text»? – Bakuriu

+0

Не могли бы вы хотя бы предоставить код, с которым вы столкнулись, но это работает неправильно? – nullop

+0

Спасибо, ребята, @ Бакури ответил на мой вопрос –

ответ

0

Предполагая следующую информацию, которую вы не предоставили (измените вопрос уточняющий, если это имеет место или нет):

  • что все элементы находятся на отдельных линиях
  • Это все элементы принимают самое одна линия (так random text делает не пролетных несколько строк)
  • что вы хотите ключи в нижнем регистре
  • что вы не хотите сохранить пробелы в начало/конец ключей и random text
  • random textне может быть только пробельные
  • Линия «Apple X» делает не содержат :
  • «оранжевая Y» линия это единственный вид линии, который заканчивается на : (плюс в конечном итоге пробел), поэтому random text не может закончиться :.
  • После строки «Apple X» всегда есть строка «оранжевый Y» (возможно, после некоторых пустых строк).

Затем вы можете сделать что-то вроде этого:

def build_dict(iterable): 
    result = {} 
    main_key = None 
    sub_key = None 
    for line in iterable: 
     # remove whitespace at beginning/end of line 
     line = line.strip() 
     if not line: 
      # throw away empty lines 
      continue 
     elif ':' not in line: 
      # we found an "Apple X" line, transform that into apple-X 
      main_key = '-'.join(line.lower().split()) 
      sub_key = None 
     elif line[-1] == ':': 
      # we found an "orange X" line 
      sub_key = '-'.join(line.lower().split()) 
     else: 
      # add a `textX : random_text` element 
      key, value = line.split(':') 
      result['-'.join([main_key, sub_key, key.strip()])] = value.strip() 
    return result 

Таким образом, вы следить за которой Apple X значение находится в main_key, и который orange Y значение в sub_key и после того, что все линии text X : random_text расщепляются на : и три ключа объединены, и значение сохраняется в словаре.

Если сделанные мной предположения не выполняются, вам необходимо обрабатывать такие вещи, как многострочные значения и т. Д., Которые зависят от формата файла.

+0

Спасибо большое Bakuriu. –

+0

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