如何在Python中通过for循环传递列表列表?

如何在Python中通过for循环传递列表列表?,python,list,for-loop,division,Python,List,For Loop,Division,我有一份清单: sample = [['TTTT', 'CCCZ'], ['ATTA', 'CZZC']] count = [[4,3],[4,2]] correctionfactor = [[1.33, 1.5],[1.33,2]] 我计算每个字符的频率(pi),将其平方,然后求和(然后我计算het=1-sum) 问题是:我不知道如何在这个循环中传递列表列表(sample,count)来提取所需的值。我以前只使用此代码传递了一个列表(例如['TACT','TTTT'..]) 我怀疑我需要

我有一份清单:

sample = [['TTTT', 'CCCZ'], ['ATTA', 'CZZC']]
count = [[4,3],[4,2]]
correctionfactor  = [[1.33, 1.5],[1.33,2]]
我计算每个字符的频率(pi),将其平方,然后求和(然后我计算het=1-sum)

问题是:我不知道如何在这个循环中传递列表列表(sample,count)来提取所需的值。我以前只使用此代码传递了一个列表(例如
['TACT','TTTT'..]

  • 我怀疑我需要添加一个更大的for循环,它对sample中的每个元素进行索引(即
    sample[0]=['TTTT',CCCZ']
    sample[1]=['ATTA',CZZC']
    。我不确定如何将其合并到代码中
** 代码

list\u of\u hets=[]
对于idx,枚举中的元素(示例):
count_dict={}
平方dict={}
对于列表中的基(元素):
如果计数中的基数为:
计数dict[base]+=1
其他:
计数dict[base]=1
对于计数中的等位基因:#计算每个字符的频率
square_freq=(count_dict[等位基因]/count[idx])**2#频率平方
等位基因
pf=0.0
对于方括号中的i:
pf+=square_dict[i]#pf-->pi^2+pj^2…pn^2#对频率求和
het=1-pf
附加(het)的列表
打印HET的列表
“失败”输出:
第70行,输入
square_freq=(count_dict[等位基因]/count[idx])**2
TypeError:不支持/:'int'和'list'的操作数类型

我不完全清楚如何处理数据中的“Z”项,但这段代码复制了中示例数据的输出

输出

{'A': 2, 'T': 2}
{'A': 1, 'T': 2, 'G': 1}
{'A': 1, 'C': 1, 'T': 2}
{'A': 1, 'T': 3}
[[0.5, 0.625], [0.625, 0.375]]
使用collections.Counter而不是
count\u dict
可以进一步简化此代码

顺便说一句,如果不在'ACGT'中的符号总是'Z',那么我们可以加快
计数的计算。去掉
base=set('ACGT')
并进行更改

count = sum(1 for u in seq if u in bases)


错误消息准确地告诉您出了什么问题。:/code>square\u freq=(count\u dict[allege]/counts[idx])**2
正在引发
类型错误:不支持的操作数类型对于/:“int”和“list”
。不能将
int
除以
list
。顺便说一下,这与您编写的代码不匹配,当您尝试将
counts[idx]
传递到
float
时,可能会引发另一个
TypeError
。我正在尝试使用类似
square\u freq=[[n/d表示n,d在zip中(subq,subr)]表示subq,subr在zip中(count_dict[allege],counts)]
。但我仍然有错误。还有其他建议吗?@PM2Ring我已经更正了。感谢你指出了什么是subq,subr???此外,我还编辑了这个问题以突出真正的问题(我在排除故障时意识到了这一点)我的最终输出必须是
[[0.5,0.625],[0.625,0.375]]
,因为我需要能够区分set1(['ATTA','TTGA'])和set2['TTCA','TTTA']中的第一个元素。另外,不要担心“Zs”,我已经找到了处理它的方法:)@biogeek:这很容易做到。请看我答案的新版本。另外,我不想使用一个函数将列表转换为嵌套列表“外部”(像这样)。这只是一个示例数据,我需要能够根据用户指定的输入进行“拆分”(列表列表)(例如,如果它是[[AA','TT','GG'],['GG','CC',TC']),[AA','TT','GG']..最终输出应该有[[1,2,3],[1,2,3],[1,2,3],])非常感谢!我一直在努力解决这个问题。
from __future__ import division

bases = set('ACGT')
#sample = [['TTTT', 'CCCZ'], ['ATTA', 'CZZC']]
sample = [['ATTA', 'TTGA'], ['TTCA', 'TTTA']]

list_of_hets = []
for element in sample:
    hets = []
    for seq in element:
        count_dict = {}
        for base in seq:
            if base in count_dict:
                count_dict[base] += 1
            else:
                count_dict[base] = 1
        print count_dict

        #Calculate frequency of every character
        count = sum(1 for u in seq if u in bases)
        pf = sum((base / count) ** 2 for base in count_dict.values())
        hets.append(1 - pf)
    list_of_hets.append(hets)

print list_of_hets
{'A': 2, 'T': 2}
{'A': 1, 'T': 2, 'G': 1}
{'A': 1, 'C': 1, 'T': 2}
{'A': 1, 'T': 3}
[[0.5, 0.625], [0.625, 0.375]]
count = sum(1 for u in seq if u in bases)
count = sum(1 for u in seq if u != 'Z')