2012-10-08 179 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]))) 

希望这有助于