Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2016 02:09:55

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Рекурсивное создание ключей словаря

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

# Результат анализа текста
dic = {
        # Уровень анализа: по словам
        'words':{
                # Слова из текста с пунктуацией
                'p':{
                        
                    }
                # Слова из текста без пунктуации
                'np':{
                        
                     }
                # Число слов
                'num':0
                }
        # Уровень анализа: по предложениям
        'sents':{
                }
      }
На самом деле, структура намного сложнее и анализ занимает весьма продолжительное время. Для обработки каждого ключа есть своя функция. Мне хочется не проводить анализ целиком, а задействовать только те функции, которые необходимы для обработки текущих ключей. Другими словами, хочу сделать следующее: если ключ есть, то возвращать его, а если нет - создавать. При необходимости создавать также ключи предыдущих уровней.

Недавно читал про реактивное программирование, возможно, это оно и есть. Как такое лучше реализовать? Вероятно, подойдут классы вида:
db = {}
db['text'] = 'Карл у Клары украл кораллы, а Клара у Карла украла кларнет.'
class Analyse:
	def words(self):
		if not 'words' in db:
			db['words'] = {}
		db['words']['list'] = db['text'].split(' ')
		db['words']['num'] = len(db['words']['list'])
			
	def nf(self):
		if not 'words' in db:
			self.words()
		if not 'nf' in db['words']:
			db['words']['nf'] = {}
			db['words']['nf']['list'] = []
			for i in range(db['words']['num']):
				db['words']['nf']['list'].append(db['words']['list'][i].replace('.','').replace('.',','))
			db['words']['nf']['num'] = len(db['words']['nf']['list'])
		return db['words']['nf']
		
analyse = Analyse()
print(analyse.nf()['list'][3])
Можно ли:
1) Упростить проверку вложенных ключей?
2) Использовать конструкцию вида analyse.words.nf.3 для доступа к данным / создания данных?
Как вообще такие вещи лучше делать, возможно, без словаря?

Отредактировано vanvanov (Апрель 2, 2016 02:12:16)

Офлайн

#2 Апрель 2, 2016 05:15:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Рекурсивное создание ключей словаря

vanvanov
если ключ есть, то возвращать его, а если нет - создавать.
Вероятно, вам поможет доступный из стандартной библиотеки питона defaultdict.
Пользоваться как-то так
d = defaultdict(list)
d["sdsd"].append("dsd")
    
f = defaultdict(dict)
f["sdsd"]["ssss"] = "ssss"
    
c = defaultdict(lambda x: .......)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version