7

我正在研究一些类似 FASTA 的序列(不是 FASTA,但我已经定义了一些与 PISCES 服务器中一些剔除的 PDB 类似的东西)。

我有个问题。我有少量称为 的序列nCatSeq,其中有 MULTIPLE 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 

(见上面的代码片段)

有没有办法做到这一点 ?

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 回答