首页 > 解决方案 > Python/我不理解列表理解中的一行循环

问题描述

下面的代码目的是特定字符串在给定字符串中连续出现的次数。但我无法理解的逻辑[sum(1 for _ in group)+1 for label, group in groups if label==''][0]。我正在寻找解释。我正在写我理解的内容,以便您纠正我。任何帮助和解释都非常感谢您的时间。

from sum(1 for _ in group)+1:Sum 1s 中的任何东西,group但我认为 likegroup没有定义,我不知道它是否是库附带的东西,但它没有着色。

[sum(1 for _ in group)+1 for label, group in groups if label==''][0]我基本上无法遵循,如果标签是一个空字符串,但我不知道[0]最后。

from itertools import groupby
checkstr = ['AGATC', 'AATG', 'TATC']
s = 'GCTAAATTTGTTCAGCCAGATGTAGGCTTACAAATCAAGCTGTCCGCTCGGCACGGCCTACACACGTCGTGTAACTACAACAGCTAGTTAATCTGGATATCACCATGACCGAATCATAGATTTCGCCTTAAGGAGCTTTACCATGGCTTGGGATCCAATACTAAGGGCTCGACCTAGGCGAATGAGTTTCAGGTTGGCAATCAGCAACGCTCGCCATCCGGACGACGGCTTACAGTTAGTAGCATAGTACGCGATTTTCGGGAAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGTATCTATCTATCTATCTATCT'
for c in checkstr:
    groups = groupby(s.split(c))
    try:
        print(c,[sum(1 for _ in group)+1 for label, group in groups if label==''][0])
    except IndexError:
        print(c,0)
    print(sum(1 for _ in group)+1)

标签: pythonlist-comprehensionitertools

解决方案


我已将列表理解分解为几个步骤,以使程序流程清晰。确保在使用我的方法时注释掉你的方法。出于某种奇怪的原因,我无法让这两种方法一起工作。

from itertools import groupby
checkstr = ['AGATC', 'AATG', 'TATC']
s = 'GCTAAATTTGTTCAGCCAGATGTAGGCTTACAAATCAAGCTGTCCGCTCGGCACGGCCTACACACGTCGTGTAACTACAACAGCTAGTTAATCTGGATATCACCATGACCGAATCATAGATTTCGCCTTAAGGAGCTTTACCATGGCTTGGGATCCAATACTAAGGGCTCGACCTAGGCGAATGAGTTTCAGGTTGGCAATCAGCAACGCTCGCCATCCGGACGACGGCTTACAGTTAGTAGCATAGTACGCGATTTTCGGGAAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGTATCTATCTATCTATCTATCT'
for c in checkstr:
    groups = groupby(s.split(c))
    try:
        """
        print(c,[sum(1 for _ in group)+1 for label, group in groups if label==''][0])
        """
        #same as
        my_list = []
        for label, group in groups:
            if label == '':
                for _ in group:
                    my_list.append(1)

        print(c,sum(my_list)+1)

    except IndexError:
        print(c,0)
    #print(sum(1 for _ in group)+1)

我得到几乎相同的输出。

但我的方法给出 1 作为'AGATC'.

我无法摆脱它try并将其放入except. 我也尝试了一些其他方法。这是我可以构造它以使列表理解中发生的事情变得清晰的最佳方式。

希望这可以帮助您消除疑问。

编辑

代码的准确性一直困扰着我,因为您在问题中发布的代码少返回两个单词。这段代码工作得很好。而且我使用了类似的列表理解形式。

from itertools import groupby
checkstr = ['AGATC', 'AATG', 'TATC']
s = 'GCTAAATTTGTTCAGCCAGATGTAGGCTTACAAATCAAGCTGTCCGCTCGGCACGGCCTACACACGTCGTGTAACTACAACAGCTAGTTAATCTGGATATCACCATGACCGAATCATAGATTTCGCCTTAAGGAGCTTTACCATGGCTTGGGATCCAATACTAAGGGCTCGACCTAGGCGAATGAGTTTCAGGTTGGCAATCAGCAACGCTCGCCATCCGGACGACGGCTTACAGTTAGTAGCATAGTACGCGATTTTCGGGAAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGAATGTATCTATCTATCTATCTATCT'
"""
for c in checkstr:
    groups = groupby(s.split(c))
    try:
        print(c,[sum(1 for _ in group)+1 for label, group in groups if label==''][0])

    except IndexError:
        print(c,0)
    print(sum(1 for _ in group)+1)
"""
for c in checkstr:
    groups = groupby(s.split(c))

    """
    print(c,[sum(1 for _ in group)+1 for label, group in groups if label==''][0])
    """
    #same as
    my_list = []
    for label, group in groups:
        if label == '':
            for _ in group:
                my_list.append(1)


    x= sum(my_list)
    if x == 0:
        print(c,0)
    else:
        print(c,x+2)

输出

AGATC 0
AATG 44
TATC 6

字数证明


推荐阅读