2012-10-08 177 views
7

我正在研究一些類FASTA序列(不是FASTA,但是我已經定義了類似於PISCES服務器的一些淘汰的PDB)。嵌套字典

我有一個問題。我有一小部分名爲nCatSeq的序列,其中有多個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 

(見上面的代碼片段)

有沒有辦法做到這一點?

回答

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

問題是將逗號「追加」一個元素只是每次創建一個新的元組。爲了解決這個問題,你使用列表和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) 
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]))) 

希望這有助於