Python-生成计数器,生成循环?
我在下面的一段代码中遇到一些问题: 输入:li是一个嵌套列表,如下所示: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 = [['>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']
>>>