嵌套字典

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 

(见上面的代码片段)

有办法做到这一点吗?

3个回答

5
问题是在于每次使用逗号“append”元素都会创建一个新的元组。为了解决这个问题,您可以使用列表和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)

更好的做法是不要使用普通字典,而是用defaultdict替换potBasin。代码可以简化为:
# 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)

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

谢谢大家,Hayden--我使用了你的建议,看起来正是我所需要的!非常感谢。 - user1729355

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

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接