<p>列表理解是<em>所有关于</em>附加到for循环中的列表(在开始时创建列表,结果返回该列表),但是您需要先转换一下逻辑。在</p>
<p>列表理解基本上是一系列嵌套循环和<code>if</code>过滤器,以及一个确定要附加的值的表达式:</p>
<pre><code>for ... in ...:
if ...:
for ... in ...:
expression_generating_value_to_append
</code></pre>
<p>至少有一个循环,零个或多个<code>if</code>过滤器和其他循环。如果你能把你的代码转换成这样的结构,你就可以把它变成一个列表理解。在</p>
<p>你的代码还没有完全到位,因为你已经做到了</p>
^{pr2}$
<p>但这很容易转化为一个简单的<code>in</code>包容测试:</p>
<pre><code>if "i" not in s[g:o + 1]:
subs.append(s[g:o + 1])
</code></pre>
<p>这基本上是一样的;如果字符<code>"i"</code>不在子串中,那么子串是可以通过的,并且可以附加:</p>
<p>所以现在你有了</p>
<pre><code>subs = []
for g in range(len(s)):
for o in range(g, len(s)):
if "i" not in s[g:o+1]:
subs.append(s[g:o+1])
</code></pre>
<p>可以转换为列表理解;使用相同的循环和<code>if</code>测试,但将<code>subs.append()</code>中的部分移到前面;这是在输出列表中生成每个值的部分:</p>
<pre><code>subs = [
s[g:o+1]
for g in range(len(s))
for o in range(g, len(s))
if "i" not in s[g:o+1]
]
</code></pre>
<p>或者在一条线上:</p>
<pre><code>subs = [s[g:o+1] for g in range(len(s)) for o in range(g, len(s)) if "i" not in s[g:o+1]]
</code></pre>
<p>这确实会产生与循环相同的输出:</p>
<pre><code>>>> 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)
...
>>> subs
['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']
>>> [s[g:o+1] for g in range(len(s)) for o in range(g, len(s)) if "i" not in s[g:o+1]]
['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']
</code></pre>
<p>如果<strong>必须</strong>使用<code>for</code>循环来测试是否存在<code>"i"</code>,那么仍然可以使用一个带有生成器表达式和<a href="https://docs.python.org/3/library/functions.html#all" rel="nofollow noreferrer">^{<cd9>}</a>或<a href="https://docs.python.org/3/library/functions.html#any" rel="nofollow noreferrer">^{<cd10>}</a>函数的循环。当您遇到一个测试不适用于一个序列中所有元素的证据时,这些基本上与您的循环在循环中设置布尔值的操作相同,只是循环截断了该点(就像您在<code>if char == "i":</code>块中使用了<code>break</code>:</p>
<pre><code>if not any(char == "i" for char in s[g:o+1]):
subs.append(s[g:o+1])
</code></pre>
<p>这是一个使用循环的缓慢的<code>"i" not in s[g:o+1]</code>实现,然后完整的列表理解变成</p>
<pre><code>subs = [
s[g:o+1]
for g in range(len(s))
for o in range(g, len(s))
if not any(char == "i" for char in s[g:o+1])
]
</code></pre>