Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-生成计数器,生成循环?_Python_Loops_Counter - Fatal编程技术网

Python-生成计数器,生成循环?

Python-生成计数器,生成循环?,python,loops,counter,Python,Loops,Counter,我在下面的一段代码中遇到一些问题: 输入:li是一个嵌套列表,如下所示: li = [['>0123456789 mouse gene 1\n', 'ATGTTGGGTT/CTTAGTTG\n', 'ATGGGGTTCCT/A\n'], ['>9876543210 mouse gene 2\n', 'ATTTGGTTTCCT\n', 'ATTCAATTTTAAGGGGGGGG\n']] 使用下面的函数,在整个子列表中存在的“/”的数目大于1的情况下,我想要的输出只是“>”后面的

我在下面的一段代码中遇到一些问题:

输入:li是一个嵌套列表,如下所示:

li = [['>0123456789 mouse gene 1\n', 'ATGTTGGGTT/CTTAGTTG\n', 'ATGGGGTTCCT/A\n'],   ['>9876543210 mouse gene 2\n', 'ATTTGGTTTCCT\n', 'ATTCAATTTTAAGGGGGGGG\n']]
使用下面的函数,在整个子列表中存在的“/”的数目大于1的情况下,我想要的输出只是“>”后面的第2到第9位数字

相反,我的代码为所有条目提供数字。而且,它给了他们很多次机会。因此,我假设我的计数器和for循环有问题。我不太明白这一点

任何帮助,非常感谢

import os

cwd = os.getcwd()


def func_one():
    outp = open('something.txt', 'w')       #output file
    li = []
    for i in os.listdir(cwd):           
        if i.endswith('.ext'):
            inp = open(i, 'r').readlines()
            li.append(inp)
    count = 0
    lis = []
    for i in li:
        for j in i:
            for k in j[1:]          #ignore first entry in sublist
                if k == '/':
                    count += 1
                if count > 1:
                    lis.append(i[0][1:10])      
                    next_func(lis, outp)
谢谢,
S:-)

您的缩进可能错误,您应该在i循环中为j检查
中的
count>1
,而不是检查
j[1:
中每个字符的缩进

此外,这里有一个更简单的方法来做同样的事情:

def count_slashes(items):
    return sum(item.count('/') for item in items)

for item in li:
    if count_slashes(item[1:]) > 1:
        print item[0][1:10]
或者,如果您需要列表中的ID:

result = [item[0][1:10] for item in li if count_slashes(item[1:]) > 1]
Python和Python是非常强大的工具,请尝试学习如何使用它们,因为它们使您的生活更加简单。上面的
count\u slashes
函数使用一个生成器表达式,我的最后一个代码段使用列表理解以一种简洁的方式构造结果列表

import itertools
import glob

lis = []
with open('output.txt', 'w') as outfile:
    for file in glob.iglob('*.ext'):
        content = open(file).read()
        if content.partition('\n')[2].count('/') > 1:
            lis.append(content[1:10])
            next_func(lis, outfile)

您对所有条目都使用数字的原因是您没有重置计数器。

Tamás提出了一个很好的解决方案,尽管它使用了与您非常不同的编码风格。尽管如此,由于您的问题是“我在下面的一段代码中遇到了一些问题”,我认为需要做更多的事情

未来如何避免这些问题

在从“我想我知道如何编写此代码”到拥有实际工作代码的过程中,您犯了几个错误

您对变量使用了无意义的名称,这几乎不可能理解您的代码,包括您自己。“但我知道每个变量的含义”的想法显然是错误的,否则你会设法自己解决这个问题。请注意,在下面我修复代码的地方,描述和讨论代码是多么困难

你试图一次解决整个问题,而不是把它分解成碎片。编写只做一件事的小函数或代码片段,一次只做一件事。对于你所做的每一件作品,都要做对并进行测试,以确保它是正确的。然后继续写其他的作品,可能会用到你已经有的作品。我说的是“片段”,但通常这意味着函数、方法或类

修复代码

这是你要求的,没有人这样做

您需要将
count=0
行移动到li:
行中i的
之后(适当缩进)。这将重置每个子列表的计数器。其次,一旦您附加到
lis
并运行
next_func
,您需要打破j[1://code>循环中k的
,以及i:
循环中j的包围

下面是一个工作代码示例(没有next_func,但可以将其添加到append旁边):

重新编写代码以使其可读

这是为了让你明白我在开始回答时的意思

>>> def count_slashes(gene):
    "count the number of '/' character in the DNA sequences of the gene."
    count = 0
    dna_sequences = gene[1:]
    for sequence in dna_sequences:
        count += sequence.count('/')
    return count
>>> def get_gene_name(gene):
    "get the name of the gene"
    gene_title_line = gene[0]
    gene_name = gene_title_line[1:10]
    return gene_name
>>> genes = [['>0123456789 mouse gene 1\n', 'ATGTTGGGTT/CTTAGTTG\n', 'ATGGGGTTCCT/A\n'],   ['>9876543210 mouse gene 2\n', 'ATTTGGTTTCCT\n', 'ATTCAATTTTAAGGGGGGGG\n']]
>>> results = []
>>> for gene in genes:
        if count_slashes(gene) > 1:
            results.append(get_gene_name(gene))

>>> results
['012345678']
>>> 

你能告诉我怎样重新设置计数器吗?这种情况经常发生在我身上,所以我通常通过一个函数运行所有操作来删除重复。谢谢@seafoid:您需要在li:
行中的
之后移动
count=0
,但是您最好使用我的代码,它更有效,并且不需要所有嵌套循环。@SilentGhost-谢谢!如果在每个子列表的第一个字符串中出现计数“/”,您的代码可以修改为排除计数吗?它不是我写的。谢谢你的帮助!哎呀,这不是一个否决票。有人刚刚收回了他的投票。
sum(基因[1:]中的seq.count('/'))
会很好地完成这项工作。回答很好——如果可以的话,我会不止一次地投票。Python一次又一次地让我惊讶,有些事情是多么简单。好答案+1
>>> def count_slashes(gene):
    "count the number of '/' character in the DNA sequences of the gene."
    count = 0
    dna_sequences = gene[1:]
    for sequence in dna_sequences:
        count += sequence.count('/')
    return count
>>> def get_gene_name(gene):
    "get the name of the gene"
    gene_title_line = gene[0]
    gene_name = gene_title_line[1:10]
    return gene_name
>>> genes = [['>0123456789 mouse gene 1\n', 'ATGTTGGGTT/CTTAGTTG\n', 'ATGGGGTTCCT/A\n'],   ['>9876543210 mouse gene 2\n', 'ATTTGGTTTCCT\n', 'ATTCAATTTTAAGGGGGGGG\n']]
>>> results = []
>>> for gene in genes:
        if count_slashes(gene) > 1:
            results.append(get_gene_name(gene))

>>> results
['012345678']
>>>