为什么这个循环不能正常工作? (蟒蛇)

时间:2013-10-22 04:20:58

标签: python loops

这是我正在尝试做的事情:

我正在比较两个文件。

因此,有两个文件包含与该突变相关的突变名称和一个名为aapos的数字。

在文件1中,有t个突变,在文件2中,有s个突变。

现在,文件编号2中的突变具有特定的生物学意义,所以我要做的是查看文件1中的突变名称(在我的程序中称为tagname)是否等同于标记名在文件2中,以及该特定突变的aapos编号是否落在文件编号2中的aapos1和aapos2的范围内。

如果满足这两个条件,那么我在文件1中的突变具有特殊的生物学意义,我们将其称为类别1.否则,它将属于第2类,这没有生物学意义。

此外,在每个文件中,都有一个名为synonymous的列,对于文件1中的每个突变,同义列的编号为0或1。

现在这就是我想要做的:对于属于CATEGORY 2的每个变异,如果该变异的synonymous列为0,我希望计数器nonsyntwo添加1,如果它是1,然后我希望计数器syntwo添加1.基本上,对于属于类别2的所有突变,我想要计算在synonymous中有多少指定值为0的计数列和指定值为1的列数。

然而,当程序运行时,我最终获得nonsyntwosyntwo的数字,这远远大于我正在使用的文件中的标记名数量。如果我要将st更改为15(每个文件中都有数千个标记名),那么我会得到94作为nonsyntwo的值。

如果程序迭代15个标记名,这怎么可能?

for x in range(1,s):
    for b in range (1,t):
        if tagname1[x]== tagname2[b]:   
            if int(aapos1[b]) <= int(aapos[x])<= int(aapos2[b]): 
                snps = snps + 1  
            elif int(synonymous[x]) == 0: 
                nonsyntwo = nonsyntwo + 1
            elif int(synonymous[x]) == 1: 
                syntwo = syntwo + 1 
        elif tagname1[x]!= tagname2[b]: 
            if int(synonymous[x]) == 0: 
                nonsyntwo = nonsyntwo + 1
            elif int(synonymous[x]) == 1: 
                syntwo = syntwo + 1

3 个答案:

答案 0 :(得分:0)

我不完全明白你要做什么,当我开始命名假设时,它已经失控,但这是你的问题:

elif tagname1[x]!= tagname2[b]: 
        if int(synonymous[x]) == 0: 
            nonsyntwo = nonsyntwo + 1
        elif int(synonymous[x]) == 1: 
            syntwo = syntwo + 1

这适用于每对x,b。这意味着它将至少 (s-2)(t-2)次执行。我怀疑这不是你想要的。

答案 1 :(得分:0)

你真的需要清楚地陈述你的问题。我们不应该只是为了理解你正在处理什么来挑选你的问题。

我理解以下内容:

  

所以有两个文件包含突变和数字的名称,   称为aapos,与该突变有关。 [...]   此外,在每个文件中,都有一个名为“synonymous”的列[...]   在文件号2中的aapos1和aapos2范围内

  1. 您有两个文件。
  2. 第一个文件有三列:tagname, appos, synonymous
  3. 第二个文件有四列:tagname, aapos, appos2, synonymous
  4.   

    现在,文件编号2中的突变具有特定的生物学特征   重要性,所以我要做的是看是否突变名称   (在我的程序中称为标记名)在文件1中等同于标记名   在文件2中,以及该特定突变的aapos编号   落在文件号2中的aapos1和aapos2范围内。[...]    如果满足这两个条件,那么我在文件1中的突变有一个特殊的   生物学意义,我们称之为第1类

    1. 如果第一列与file1
    2. 中的列匹配,则要检查file2中的每一行
    3. 如果匹配,并且如果第二列包含file2中第二列和第三列的范围,则要将该行添加到名为category1的集合中;否则添加到另一个名为category2的集合。
    4.   

      在每个文件中,都有一个名为“synonymous”的列,用于   在文件1中的每个突变中,同义列被分配了多个   0或1.现在这就是我想要做的:对于每个属于的变异   到第2类,如果该突变的“同义”列为0,我   希望计数器'nonsyntwo'添加1,如果它是1,那么我想要   计数器'syntwo'加1。

      1. category2集合中取出每个项目,并计算1和0的数量。
      2. 如果这是正确的,那么您需要以下内容(假设您的文件以逗号分隔)

        import csv
        from collections import Counter
        
        with open('file1.txt') as f:
           reader = csv.reader(f, delimiter=',')
           file1 = list(reader)
        
        with open('file2.txt') as f:
           reader = csv.reader(f, delimiter=',')
           file2 = list(reader)
        
        cat1 = []
        cat2 = []
        
        for line in file2:
           for line2 in file1:
              if line[0] == line2[0]:
                  if int(line2[1]) <= int(line[1]) <= int(line2[2]):
                      cat1.append(line)
                  else:
                      cat2.append(line)
        
        counter = Counter(line[3] for line in cat2)
        nonsyntwo = counter['0']
        syntwo = counter['1']
        

答案 2 :(得分:0)

我不清楚你问题的性质。但是,我有这些改进建议:

aapos = map(int, appos)
aapos1 = map(int, appos1)
aapos2 = map(int, appos2)
synonyms = map(int, synonyms) # or are they already?
for x in range(1,s):
    for b in range (1,t):
        # Here, x and b go from 1 to s resp t.
        # So you are always missing [0] of the array. 
        # Doing
        x, b = x-1, b-1
        # is not very clean, but it helps for now.
        checksyn = True
        if tagname1[x] == tagname2[b]:
            if aapos1[b] <= aapos[x] <= aapos2[b]:
                snps += 1
                checksyn = False
        if checksyn:
            if synonymous[x] == 0: 
                nonsyntwo += 1
            elif synonymous[x] == 1: # if 1 is the only other possible value, an else: would be enough here.
                syntwo += 1