s = "lallalaiial"
subs = []
for g in range(len(s)):
for o in range(g, len(s)):
substring = s[g:o+1]
passable = True
for v in range(len(substring)):
if(substring[v] == "i"):
passable = False
if(passable):
subs.append(substring)
print(subs)
我能为for循环做一个列表理解吗?只有在最后一个for循环检查了列表后,才应向列表中添加新值。我不想删除最后一个for循环-即使没有它也可以获得相同的结果。在
既然你想保持最内部的循环,你可以这样做:
由于您使用
passable
标志只是为了测试i
是否在当前子串中,因此可以使用in
运算符对以下列表进行理解:这和您的代码都将输出:
['l', 'la', 'lal', 'lall', 'lalla', 'lallal', 'lallala', 'a', 'al', 'all', 'alla', 'allal', 'allala', 'l', 'll', 'lla', 'llal', 'llala', 'l', 'la', 'lal', 'lala', 'a', 'al', 'ala', 'l', 'la', 'a', 'a', 'al', 'l']
列表理解是所有关于附加到for循环中的列表(在开始时创建列表,结果返回该列表),但是您需要先转换一下逻辑。在
列表理解基本上是一系列嵌套循环和
if
过滤器,以及一个确定要附加的值的表达式:至少有一个循环,零个或多个
if
过滤器和其他循环。如果你能把你的代码转换成这样的结构,你就可以把它变成一个列表理解。在你的代码还没有完全到位,因为你已经做到了
^{pr2}$但这很容易转化为一个简单的
in
包容测试:这基本上是一样的;如果字符
"i"
不在子串中,那么子串是可以通过的,并且可以附加:所以现在你有了
可以转换为列表理解;使用相同的循环和
if
测试,但将subs.append()
中的部分移到前面;这是在输出列表中生成每个值的部分:或者在一条线上:
这确实会产生与循环相同的输出:
如果必须使用} 或^{} 函数的循环。当您遇到一个测试不适用于一个序列中所有元素的证据时,这些基本上与您的循环在循环中设置布尔值的操作相同,只是循环截断了该点(就像您在
for
循环来测试是否存在"i"
,那么仍然可以使用一个带有生成器表达式和^{if char == "i":
块中使用了break
:这是一个使用循环的缓慢的
"i" not in s[g:o+1]
实现,然后完整的列表理解变成相关问题 更多 >
编程相关推荐