繁体   English   中英

如何在Python中将这种理解转换为for循环?

[英]How to convert this comprehension to a for-loop in Python?

sample = [['CGG','ATT'],['GCGC','TAAA']]
base_counts = [[Counter(base) for base in sub] for sub in sample]
#Output : [[Counter({'G': 2, 'C': 1}), Counter({'T': 2, 'A': 1})], [Counter({'C': 2, 'G': 2}), Counter({'A': 3, 'T': 1})]]

base_freqs = [[{k_v[0]:k_v[1]/len(bases[i]) for i,k_v in enumerate(count.items())} for count in counts] for counts, bases in zip(base_counts, sample)]
#Output 2 [[{'C': 0.3333333333333333, 'G': 0.6666666666666666}, {'A': 0.3333333333333333, 'T': 0.6666666666666666}], [{'C': 0.5, 'G': 0.5}, {'A': 0.75, 'T': 0.25}]]

样本是输入,而Output2是程序的最终输出。 带有base_freqs的程序将计算每对样本中“基数”(基数= ATGC)的频率。 输出提供正确答案。 但是,我希望代码以for循环的形式出现,而不是理解。

此代码最初取自此处发布的答案

是。 从内到外从左至右阅读理解的方式。 让我们对它进行一些格式化以提高可读性:

base =[   
         [ 
             {   k_v[0] : k_v[1]/len(bases[i]) 
                 for i,k_v in enumerate(count.items())
             }  
             for count in counts
         ] 
         for counts, bases in zip(base_counts, sample) 
      ]

是相同的:

bases = []
for counts, bases in zip(base_counts, sample):
    temp_list = []
    for count in counts:
        temp_dict = {}
        for i, k_v in enumerate(count.items()):
            temp_dict[k_v[0]] = k_v[1] / len(bases[i])
        temp_list.append(temp_dict)
    bases.append(temp_list)

从性能的角度来看,列表理解更好,因为您不是在不断创建新的列表和字典,也不是在调用诸如append之类的方法,而这会带来一些开销。

您始终可以翻译列表理解,例如

ls = [<EXPR> for <VARS> in <ITERABLE> if <CONDITIONAL>]

ls = []
for <VARS> in <ITERABLE>:
    if <CONDITIONAL>:
        ls.append(<EXPR>)

理解中的多个for子句对应于翻译中的嵌套for循环,最左边的for子句对应于最外面的for循环。

生成器,字典和集合理解的翻译是相似的。

使用for循环并不是一件容易的事,但是它看起来应该像这样。

result = []
for counts, bases in zip(base_counts, sample):
    some_list = []
    for count in counts:
        some_dict = {}
        for i,k_v in enumerate(count.items()):
            some_dict[k_v[0]] = k_v[1]/len(bases[i])
        some_list.append(some_dict)
    result.append(some_list)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM