Вложенный словарь

Я работаю над некоторыми FASTA-подобными последовательностями (а не FASTA, но кое-что, что я определил, это похоже на некоторый отбракованный PDB с сервера PISCES).

У меня есть вопрос. У меня есть небольшое количество последовательностей, называемых nCatSeq , для которых есть MULTIPLE nBasinSeq . Я просматриваю большой файл PDB, и я хочу извлечь для каждого nCatSeq соответствующий nBasinSeq без избыточности в словаре. Ниже приведен фрагмент кода, который делает это.

 nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] if nCatSeq not in potBasin: potBasin[nCatSeq]=nBasinSeq else: if nBasinSeq not in potBasin[nCatSeq]: potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq else: pass 

В качестве ответа для одного nCatSeq я получаю следующее:

 '4241': ((('VUVV', 'DDRV'), 'DDVG'), 'VUVV') 

я хочу, однако, что:

'4241': ('VUVV', 'DDRV', 'DDVG', 'VUVV')

Мне не нужны все дополнительные скобки из-за следующей команды

 potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 

(см. выше фрагмент кода)

Есть ли способ сделать это ?

3 Solutions collect form web for “Вложенный словарь”

Вы можете добавить их как кортежи:

 if nCatSeq not in potBasin: potBasin[nCatSeq] = (nBasinSeq,) else: if nBasinSeq not in potBasin[nCatSeq]: potBasin[nCatSeq] = potBasin[nCatSeq] + (nBasinSeq,) 

Таким образом, а не:

 (('VUVV', 'DDRV'), 'DDVG') # you will get ('VUVV', 'DDRV', 'DDVG') # == ('VUVV', 'DDRV')+ ('DDVG',) 

Проблема заключается в том, что запятая «добавляет» элемент просто создает новый кортеж каждый раз. Чтобы решить эту проблему, вы используете списки и append :

 nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] if nCatSeq not in potBasin: potBasin[nCatSeq]=[nBasinSeq] elif nBasinSeq not in potBasin[nCatSeq]: potBasin[nCatSeq].append(nBasinSeq) 

Еще лучше было бы вместо того, чтобы сделать потаБасин нормальным словарем, замените его на defaultdict . Затем код можно упростить, чтобы:

 # init stuff from collections import defaultdict potBasin = defaultdict(list) # inside loop nCatSeq=item[1][n]+item[1][n+1]+item[1][n+2]+item[1][n+3] nBasinSeq=item[2][n]+item[2][n+1]+item[2][n+2]+item[2][n+3] potBasin[nCatSeq].append(nBasinSeq) 

Ваш вопрос сводится к выравниванию вложенного списка и исключению избыточных записей:

 def flatten(nested, answer=None): if answer is None: answer = [] if nested == []: return answer else: n = nested[0] if is instance(n, tuple): return flatten(nested[1:], nested(n[0], answer)) else: return flatten(nested[1:], answer+n[0]) 

Итак, с вашим вложенным словарем:

 for k in nested_dict: nested_dict[k] = tuple(flatten(nested_dict[k])) 

если вы хотите удалить повторяющиеся записи:

 for k in nested_dict: nested_dict[k] = tuple(set(flatten(nested_dict[k]))) 

Надеюсь это поможет

  • Проверьте, содержит ли словарь python значение, и если да, возвращайте соответствующее значение
  • Получить подмножество словаря Python
  • Как вычесть значения из словарей
  • Могу ли я выполнить упорядоченный по умолчанию dict в Python?
  • Применение функции к значениям в dict
  • многопользовательский словарь из кортежей в python
  • Преобразование списка в dict python
  • Каков самый быстрый способ получить произвольный элемент из словаря Python?
  • Python - лучший язык программирования в мире.