<p>对代码的一些注释:</p>
<pre><code>for counter in range (0,len(words)):
while counter < len(words):
</code></pre>
<p>除非在<code>for</code>循环下缩进<code>while</code>循环,否则无法编译。而且,如果你这样做,内环会把外环的循环计数器完全搞砸。最后,您几乎永远不想在Python中维护显式循环计数器。你可能想要这个:</p>
^{pr2}$
<p>下一步:</p>
<pre><code>z = list(words[counter]) # z is a temp list created to slice words
</code></pre>
<p>您已经可以用与切片列表完全相同的方式对字符串进行切片,因此这是不必要的。在</p>
<p>下一步:</p>
<pre><code> upper = [k.upper() for k in z[chars]] # string formatting EX: uppercase
</code></pre>
<p>这是一个错误的变量名,因为在同一行中有一个与您调用的函数同名。在</p>
<p>同时,你定义事物的方式,<code>z[chars]</code>是一个字符,<code>words[4]</code>的副本。您可以在Python中迭代单个字符,因为每个字符本身就是一个字符串。但这通常是没有意义的-<code>[k.upper() for k in z[chars]]</code>和{<cd6>}是一回事。在</p>
<pre><code> z[chars] = upper [0] # replace formatted character with original
</code></pre>
<p>所以你只想让1个字符的列表从中取出第一个字符…为什么要把它列为一个列表呢?只需将最后两行替换为<code>z[chars] = z[chars].upper()</code>。在</p>
<pre><code>else:
break
</code></pre>
<p>这将在第一个长度小于4的字符串处停止,而不是跳过长度小于4的字符串,这正是您想要的。这样说是<code>continue</code>,而不是{<cd9>}。或者,最好是从名单的末尾掉下来。在某些情况下,没有<code>continue</code>很难写东西,但在这种情况下,很容易它已经在循环的末尾,而且实际上它在一个<code>else:</code>中,它没有其他内容,所以只需删除这两行。在</p>
<p>很难用<code>upper</code>来判断你的循环是错误的,因为如果你不小心调用了<code>upper</code>两次,看起来就像你调用了一次一样。将<code>upper</code>更改为<code>chr(ord(k)+1)</code>,这将用下一个字母替换任何字母。然后试试:</p>
<pre><code>words = ['house', 'flower', 'tree', 'a', 'abcdefgh']
</code></pre>
<p>您会注意到,例如,您得到的是<code>'flowgr'</code>,而不是{<cd17>}。在</p>
<p>您可能还需要添加一个变量,该变量用于计算运行内部循环的次数。它应该是<code>len(words)</code>次,但如果你没有短单词,它实际上是<code>len(words) * len(words)</code>,如果你有短单词,<code>len(words) * len(<up to the first short word>)</code>。如果你有1000个单词,你会让电脑做很多额外的工作,它必须做1000000个循环,而不是1000个。从技术上讲,你的算法是O(N^2),即使它只需要是O(N)。在</p>
<p>综合起来:</p>
<pre><code>words = ['house', 'flower', 'tree', 'a', 'abcdefgh'] #string list
chars = 4 #character position in string (0,1,2...)
for counter, word in enumerate(words):
if len(word) > chars: # to compare char position and z length
z = list(word)
z[chars] = chr(ord(z[chars]+1) # replace character with next character
words[counter] = "".join(z) # convert and replace temp list back into original word str list
print (words)
</code></pre>
<p>这和你的原始代码一样(除了使用“next character”而不是“uppercase character”),没有bug,对计算机的工作更少,更容易阅读。在</p>