python - 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)
解决方案
我已将列表理解分解为几个步骤,以使程序流程清晰。确保在使用我的方法时注释掉你的方法。出于某种奇怪的原因,我无法让这两种方法一起工作。
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
推荐阅读
- html - 图像以 html 显示,但在 nginx 中损坏
- amazon-web-services - 将数据 ESP8266 发送到 AWS IOT Shadows 时出现“无法设置 SSL 连接尝试发送数据”错误消息
- laravel - 使用数据透视表从主表中获取数据
- php - 为什么搜索会调用未定义的错误方法 stmt::fetch_row()?
- aspnetboilerplate - 集成测试 IocManager 为 Null
- webdriver-io - 在运行时在 wdio 中选择规范功能文件
- javascript - 如何在父组件的插槽中使用 v-for 变量?
- r - read.csv 将空字符列转换为 NA
- css - 字体真棒无效属性值错误
- html - 如何对齐谷歌地图 iframe 和一个盒子?