Python 我不明白列表理解中的一行循环。

问题描述 投票:1回答:1

下面的代码目的是在一个给定的字符串中连续出现多少次特定的字符串。但我不明白其中的逻辑 [sum(1 for _ in group)+1 for label, group in groups if label==''][0] . 我希望得到一个解释。我写的是我的理解,所以你可以纠正我。任何帮助和解释是高度赞赏感谢你的时间。

sum(1 for _ in group)+1 : 任何东西都是1的总和 group 但我觉得 group 是没有定义的,我不知道是不是库里自带的东西,但它是没有颜色的。

[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)
python list-comprehension itertools
1个回答
1
投票

我已经把列表理解分解成几步,使程序流程清晰.确保你在使用我的方法时注释出你的方法.由于一些奇怪的原因,我无法让两种方法一起工作。

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)

OUTPUT

AGATC 0
AATG 44
TATC 6

Proof on word count


0
投票

您可能想阅读关于 理解列表.

让我们来分析一下。sum(1 for _ in group)+1 是相同的 len(group)+1 如果 group__len__ 属性。如果我们假设可以做到 len(group) 那么我们就可以把这个理解改写成。[len(group)+1 for label, group in groups if label==''][0]让我们看看这个 [len(group) for label, group in groups]这只是一个组中每一个组的大小的列表。有了 if label=='' 基本上我们删除了该列表中所有以空字符串作为标签的条目。列表中的 [0] 只选择第一个条目。

我的话。第一个有空标签的组的大小(+1)。


0
投票

你可以写出代码来明确具体发生了什么。

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

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

列表理解法创建了一个列表。当 label 不为空,你就会留下一个空列表。那么列表中的第一个元素(因此是 [0] 在最后)被打印出来。如果列表为空,则会导致索引错误。这个错误会被 exeption 处理程序,打印0代替第一个列表元素。

© www.soinside.com 2019 - 2024. All rights reserved.