2012-10-08 24 views
7

私はいくつかのFASTAのようなシーケンスで作業しています(FASTAではなく、PISCESサーバからのいくつかの抽出されたPDBに似ています)。ネストされた辞書

私は質問があります。私はnCatSeqと呼ばれるシーケンスの小さな番号を持っています。そのためには、複数の数字がnBasinSeqです。私は大きなPDBファイルを調べて、対応するnBasinSeqのそれぞれをnCatSeqのために抽出したいと思います。これを行うコードスニペットを以下に示します。

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 

私はしかし、何をしたい1 nCatSeq、

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

のための答えとして、次の取得です:

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

次のコマンドのために、すべての余分な角括弧は不要です。

potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 

これを行う方法があります(コードスニペット上記参照)?

答えて

1

あなたはタプルとして追加することができます

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',) 
+0

は皆さんありがとう役立ちます - 私はあなたの提案とそれを使用しましたちょうど私が必要としているようだ!どうもありがとうございました。 – user1729355

5

問題は、毎回新しいタプルを作成するだけの要素を「追加」するコンマを置くことです。

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) 

さらに良い

が、代わりにpotBasinに通常の辞書を作ること defaultdictと交換になります。これを解決するには、リストや appendを使用しています。コードは、その後に簡素化することができます。

# 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

ご質問は、ネストされた平坦化に帰着します冗長エントリをリストにして削除します。

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

希望は、このヘイデン、

関連する問題