Wit以文件结束

时间:2015-03-26 22:23:27

标签: python dictionary key

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

3 个答案:

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