我在处理下面的一段代码时遇到了一些问题:
输入:li 是一个嵌套列表,如下所示:
li = [['>0123456789 mouse gene 1\n', 'ATGTTGGGTT/CTTAGTTG\n', 'ATGGGGTTCCT/A\n'], ['>9876543210 mouse gene 2\n', 'ATTTGGTTTCCT\n', 'ATTCAATTTTAAGGGGGGGG\n']]
使用下面的函数,我想要的输出只是'>'之后的第2到第9位数字,条件是整个子列表中'/'的数量> 1。
相反,我的代码为所有条目提供了数字。此外,它给了他们多次。因此,我假设我的计数器和 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)
谢谢, 小号:-)
最佳答案
您的缩进可能有误,您应该在 for j in i
循环中检查 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 list comprehensions和 generator expressions是非常强大的工具,尝试学习如何使用它们,因为它可以让您的生活变得更加简单。上面的 count_slashes
函数使用了一个生成器表达式,而我的最后一个代码片段使用了一个列表理解来以一种简洁明了的方式构造结果列表。
关于Python - 制作计数器,制作循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2973926/