Python:2.7.9 我删除了所有代码,因为我疯了。 这里是要点(罗莎琳德的挑战):
我想要一个看起来像这样的文件(在插入符号上没有引号)
">" Rosalind_0304
actgatcgtcgctgtactcg
actcgactacgtagctacgtacgctgcatagt
">" Rosalind_2480
gctatcggtactgcgctgctacgtg
ccccccgaagaatagatag
">" Rosalind_2452
cgtacgatctagc
aaattcgcctcgaactcg
等...
我能弄清楚怎么做基本上就是这一切,我的思绪如此混乱。我只是展示了我正在做的事情,但没有做到。
第一。我想在文件中搜索'>' 然后将该行的其余部分作为键分配到字典中。 阅读下一行,直到下一行'>'并做一些计算和返回 发现该关键的价值。 浏览文件并为每个字符串执行此操作。
然后比较所有值并返回任何一个最高的键。 有人可以帮忙吗? 如果我休息一下,这可能会有所帮助。我整天都在编码,我觉得我闻到了颜色。
def func(dna_str):
bla
return gcp #gc count percentage returned to the value in dict
答案 0 :(得分:0)
使用my_function
某处返回该百分比值:
with open('rosalind.txt', 'r') as ros:
rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()}
top_key = max(rosa, key=rosa.get)
print(top_key, rosa.get(top_key))
对于文件中的每一行,首先检查在删除尾随空格后是否还有剩余行,然后丢弃空行。接下来,它将每个非空行添加为字典的条目,其中键是除了不需要的>
之外的空间左侧的所有内容,并且值是将所有内容发送到右侧的结果你职能的空间。
然后保存对应于最高值的键,然后打印该键及其对应的值。你留下了一个你可以随意处理的字典rosa
。
模块的完整代码:
def my_function(dna):
return 100 * len(dna.replace('A','').replace('T',''))/len(dna)
with open('rosalind.txt', 'r') as ros:
with open('rosalind_clean.txt', 'w') as output:
for line in ros:
if line.startswith('>'):
output.write('\n'+line.strip())
elif line.strip():
output.write(line.strip())
with open('rosalind_clean.txt', 'r') as ros:
rosa = {line[1:].split(' ')[0]:my_function(line.split(' ')[1].strip()) for line in ros if line.strip()}
top_key = max(rosa, key=rosa.get)
print(top_key, rosa.get(top_key))
rosalind.txt
的完整内容:
>Rosalind_6404 CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCG
TTTCTCTGAGGCTTCCGGCCTTCCCTCCCACTAATAATTCTGAGG
>Rosalind_5959 CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCA
GGCGCTCCGCCGAAGGTCTATATCCA
TTTGTCAGCAGACACGC
>Rosalind_0808 CCACCCTCGTGGT
ATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGACTGGGAACCTGCGGGCAGTAGGTGGAAT
运行模块时的结果:
Rosalind_0808 60.91954022988506
这应该正确处理每行不一定有一个条目的输入文件。
请参阅SO的格式指南,了解如何制作内联代码或阻止代码代码以获取">"
之类的内容。如果您希望它显示为常规文本而不是代码,请使用反斜杠转义>
:
类型:
\>Rosalind
结果:
>罗莎琳德
答案 1 :(得分:0)
我想我现在已经完成了这一部分。非常感谢。 BUUUUT。它抛出了一个错误。
rosa = {line[1:].split(' ')[0]:calc(line.split(' ')[1].strip()) for line in ros if line.strip()}
IndexError:列表索引超出范围
这是我的功能顺便说一句。
def calc(dna_str):
for x in dna_str:
if x == 'G':
gc += 1
divc += 1
elif x == 'C':
gc += 1
divc += 1
else:
divc += 1
gcp = float(gc/divc)
return gcp
答案 2 :(得分:0)
确切的测试文件。之前或之后没有空行。
> Rosalind_6404
CCTGCGGAAGATCGGCACTAGAATAGCCAGAACCGTTTCTCTGAGGCTTCCGGCCTTCCC
TCCCACTAATAATTCTGAGG
> Rosalind_5959
CCATCGGTAGCGCATCCTTAGTCCAATTAAGTCCCTATCCAGGCGCTCCGCCGAAGGTCT
ATATCCATTTGTCAGCAGACACGC
> Rosalind_0808
CCACCCTCGTGGTATGGCTAGGCATTCAGGAACCGGAGAACGCTTCAGACCAGCCCGGAC
TGGGAACCTGCGGGCAGTAGGTGGAAT