2012-10-08 26 views
7

Pracuję nad niektórymi sekwencjami FASTA (nie FASTA, ale coś, co zdefiniowałem, jest podobne dla niektórych usuniętych PDB z serwera PISCES).Zagnieżdżony słownik

Mam pytanie. Mam małą liczbę sekwencji o nazwie nCatSeq, dla których istnieje wiele opcji nBasinSeq. Przechodzę przez duży plik PDB i chcę wyodrębnić dla każdego odpowiadającego nBasinSeq bez nadmiarowości w słowniku. Fragment kodu, który to robi, jest podany poniżej.

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 

uzyskać następujące jako odpowiedź na jeden nCatSeq,

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

co chcę jednak jest:

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

Nie chcę wszystkich dodatkowych nawiasów z powodu następującego polecenia:

potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 

(patrz wyżej fragmencie kodu)

Czy istnieje sposób, aby to zrobić?

Odpowiedz

1

Możesz dodać je jako krotek:

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

ten sposób, zamiast:

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

Dziękuję chłopaki, Hayden - Kiedyś swoje sugestie i to wydaje się być tym, czego potrzebowałem! Dziękuję Ci bardzo. – user1729355

5

Problem polega na wstawieniu przecinka, aby "dołączyć" element, po prostu tworzy nową krotkę za każdym razem. Aby rozwiązać ten problem korzystania z wykazów i 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) 

Jeszcze lepiej byłoby, zamiast podejmowania potBasin normalnego słownika, zastąpić go defaultdict. Kod może być następnie uprościć:

# 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) 
0

Twoje pytanie sprowadza się do spłaszczenia zagnieżdżone lista i eliminacja zbędnych wpisów:

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]) 

Tak, z zagnieżdżonego słownika:

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

jeśli chcesz wyeliminować zduplikowane wpisy:

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

nadzieję, że to pomaga