我试图找到碱基(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'}}
在我看来,值并未添加到已经存在的键中,但是新值正在替换旧值。
我该如何解决这个问题?
答案 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