累积值到字典中的对应键?

时间:2019-03-09 09:43:19

标签: python python-3.x

我试图找到碱基(A,C,G,T)的位置,并将其放入对应于其位置的字典中。

我正在处理一个文本行,其中包含以下几行

----T
C
-C
-----G
C
-----C
---T
----A
----C
-----G

根据以上信息,我知道

  • C在第一位置

  • C在第二位置

  • 第3位位置未知

  • T在第4位

  • C,A,T在第五位

  • C,G在第六位

到目前为止,我已经在下面编写了代码

def chunks(chunks_file):
    set_bases = {}
    with open(chunks_file) as file:
        for line in file:
            for character in line:
                if character.isalpha():
                    letter = character
                    position = line.find(letter) + 1
                    set_bases[position] = {letter}

    return set_bases

我当前的输出是:

{5: {'C'}, 1: {'C'}, 2: {'C'}, 6: {'G'}, 4: {'T'}}

其中期望的输出将是:

{1: {'C'}, 2: {'C'}, 4: {'T'}, 5: {'C', 'A', 'T'}, 6: {'C', 'G'}}

在我看来,值并未添加到已经存在的键中,但是新值正在替换旧值。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

考虑到您拥有txt文件,可以按照以下方式进行操作:

outDict = {}

with open('data.txt', 'r') as inFile:
    lines = [line.strip() for line in inFile if not line == '\n']
    outDict = dict((str(line.count('-')+1),set()) for line in lines)
    for line in lines:
        outDict[str(line.count('-')+1)].update(line[-1])
    print(outDict)

结果:

{'5': {'C', 'A', 'T'}, '1': {'C'}, '2': {'C'}, '6': {'C', 'G'}, '4': {'T'}}

答案 1 :(得分:1)

我可以提出以下改进建议:

import collections

def chunks(filename):
    bases = collections.defaultdict(set)

    with open(filename) as f:
        for line in f:
            line = line.strip()
            if len(line) > 0:
                for i, char in enumerate(line):
                    if char.isalpha():
                        position = i + 1
                        bases[position].add(char)

    return bases
  • 此代码使用collections.defaultdict,因此您不必检查位置是否在字典中。
  • 在行上进行迭代时,我也使用enumerate(),因此您已经拥有该职位,无需致电line.find()

此代码可以按如下方式使用:

>>> d = chunks('your-file-name.txt')
>>> d
defaultdict(<class 'set'>, {5: {'T', 'C', 'A'}, 1: {'C'}, 2: {'C'}, 6: {'G', 'C'}, 4: {'T'}})

>>> dict(d)
{5: {'C', 'A', 'T'}, 1: {'C'}, 2: {'C'}, 6: {'G', 'C'}, 4: {'T'}}

>>> for k, v in sorted(d.items()):
...     print(k, v)
1 {'C'}
2 {'C'}
4 {'T'}
5 {'C', 'A', 'T'}
6 {'G', 'C'}

答案 2 :(得分:0)

尝试这样的事情:

def chunks(chunks_file):
    set_bases = {}
    with open(chunks_file) as file:
        for line in file:
            for character in line:
                if character.isalpha():
                    letter = character
                    position = line.find(letter) + 1
                    if position in set_bases:
                        set_bases[position].append(letter)
                    else:
                        set_bases[position] = [letter]

    return set_bases