【问题标题】:How to convert this comprehension to a for-loop in Python?如何将此理解转换为 Python 中的 for 循环?
【发布时间】:2016-10-17 14:40:17
【问题描述】:
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 循环格式查看代码,而不是理解。

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

【问题讨论】:

  • 如果有人能告诉我如何改进这个问题,而不是简单地反对它,那就太好了。
  • 不是downvoter,但您的问题似乎缺少您提供的代码的输入和输出。如果您希望有人阅读和解释/给您一个 for 循环示例,为什么不告诉我们它应该做什么,让我们更容易帮助您?
  • Stack Overflow 更适合于 Here is the for 基于循环的此列表理解的重新实现之类的问题。我希望它会产生X,但它会产生Y。你能帮忙吗?,而不是像Is it possible to...这样的问题。
  • @Patrick,展示了他们尝试 - 只是尝试 - 实现 for 循环等效项的尝试会使这个问题变得正确。在目前的状态下,它给人一种通常的“请为我做我的工作”的氛围......但由于每个人都决定支持它,以及一个没有任何解释的纯代码答案,我想我不得不让它通过...
  • @FrédéricHamidi 感谢您的建议。我会记住,在将来发布此类问题之前发布我自己的尝试。另外,我假设一旦我自己阅读了 for 循环代码,我就能够理解其中的逻辑。但是已经回答的mos已经努力解释了从理解到for循环的转变。非常感谢!

标签: python for-loop for-comprehension


【解决方案1】:

是的。从外到内从左到右阅读理解的方式。让我们稍微格式化一下以便于阅读:

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 之类的方法,这会产生一些开销。

【讨论】:

    【解决方案2】:

    您总是可以翻译列表理解,例如

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

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

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

    生成器、字典和集合推导的翻译是类似的。

    【讨论】:

    • 在推导式中,首先阅读左侧的for 子句。 [a for a in (x,y) for x, y in [(1,2), (3,4)]] 失败,因为解释器在定义之前看到 x
    • @PatrickHaugh Argh,你是对的。我注意到在看到您的评论前十秒我犯了一个错误。幸运的是,我实际上在想我应该如何小心不要在我写答案时搞砸它,但我还是设法做到了。 :D 更新了答案。
    【解决方案3】:

    使用 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)
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2019-03-21
      • 2022-01-12
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多