7

私はいくつかのFASTAに似たシーケンスに取り組んでいます(FASTAではありませんが、PISCESサーバーからのいくつかのカリングされたPDBに類似したものを定義しました)。

質問があります。と呼ばれるシーケンスの数が少なく、nCatSeq複数ありますnBasinSeqnCatSeq大きなPDBファイルを調べて、対応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

1つのnCatSeqの答えとして、次のようになります。

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

しかし、私が欲しいのは:

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

次のコマンドのため、余分なブラケットをすべて必要としません

potBasin[nCatSeq]=potBasin[nCatSeq],nBasinSeq 

(上記のコードスニペットを参照)

これを行う方法はありますか?

4

3 に答える 3

5

問題は、要素を「追加」するためにコンマを入れることです。毎回新しいタプルを作成するだけです。これを解決するには、リストとを使用します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)

さらに良いのは、potBasin を通常の辞書にする代わりに、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)
于 2012-10-08T16:07:06.103 に答える
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',)
于 2012-10-08T16:08:59.793 に答える
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])))

お役に立てれば

于 2012-10-08T16:09:53.303 に答える