如何在条件语句中的for循环迭代器上使用比较语句?

时间:2019-06-24 13:54:18

标签: python

我正在遍历一个大(300多个列和1000万个以上的行).txt文件(制表符分隔)。 文件格式:

species 1    ...    sample1(11th col)    sample2    ....    sampleN(353th col)
species 2    ...    6046                 5364               ....
species 3    ...    15422                0                  ....

每行都是一个物种,从第11列开始,每列都是一个样本。对于每个样本,我想知道该样本中有多少个物种的值大于0。所以我要做的是遍历每行,查看哪些样本的值大于0,如果是,则添加1。对于每个样本,总和1s是值大于0的行总数。

为此,我使用以下代码:

samples = []
OTUnumber = []

with open('all.16S.uniq.txt','r') as file:
     for i,line in enumerate(file): 
        columns = line.strip().split('\t')[11:353] 
        if i == 0: #headers are sample names so first row
            samples = columns #save sample names 
            OTUnumbers = [0 for s in samples] #set starting value as zero
        else:
            for n,v in enumerate(columns):
                if v > 0:
                    OTUnumber[n] = OTUnumber[n] + 1
                else:
                    continue

result = dict(zip(samples,OTUnumbers))

运行此代码时,出现以下错误: TypeError: '>' not supported between instances of 'str' and 'int' if v > 0引发此错误。为什么我不能写这句话?

因此,如果列[n]的v> 0,我想在该索引的OTUnumber处加1。如果v <0,我想跳过该行而不添加1(或添加0)。

如何使此代码起作用?

3 个答案:

答案 0 :(得分:1)

  

运行此代码时,出现以下错误:TypeError: '>' not supported between instances of 'str' and 'int'如果v > 0引发此错误。为什么我不能写这句话?

如错误所述,您正在尝试对字符串和int使用比较运算符>,这是不允许的。 v是一个字符串,而不是整数。大概您想使用int(v) > 0而不是v > 0,或者首先进行以​​下操作。

columns = [int(v) for v in line.strip().split('\t')[11:353]] 

答案 1 :(得分:1)

尝试一下:

samples = []
OTUnumbers = []

with open('all.16S.uniq.txt','r') as file:
     for i,line in enumerate(file): 
        columns = line.strip().split('\t')[11:353] 
        if i == 0: #headers are sample names so first row
            samples = columns #save sample names 
            OTUnumbers = [0 for s in samples] #set starting value as zero
        else:
            for n,v in enumerate(columns):
                if int(v) > 0:
                    OTUnumbers[n] = OTUnumbers[n] + 1
                else:
                    continue

result = dict(zip(samples,OTUnumbers))

基本上是2个修复程序:

  • v广播到int
  • 在所有代码中
  • OTUnumber重命名为OTUnumbers

答案 2 :(得分:1)

问题是,在您的文本文件中有记录是字符串,并且您的代码正在尝试将整数与抛出TypeError异常的字符串进行比较

要使代码正常工作,您可以在比较int(v) > 0

之前将记录转换为int