<p>我不想在没有给你一个正确答案的情况下对你喋喋不休,所以如果你不关心良好的编码实践,请跳过。</p>
<p><strong>不要使用像<code>list</code>和<code>string</code>这样的变量名,因为在<code>list</code>的情况下,这是您正在创建的类型的名称。事实上,这就是你如何创建一个空实例的类型:</p>
<pre><code>something=list() # this is an empty list!
</code></pre>
<p>这会使参考<code>list[2]</code>或类似的东西变得混乱。所以很明显没有出现任何错误,但是为了可读性,请尝试给出有意义的变量名。</p>
<p>好吧,我已经说完了,你要找的代码是</p>
<pre><code>st='Did the quick brown fox really jump over the fence'.split()
c=[len(i) for i in st] # gives [3, 3, 5, 5, 3, 6, 4, 4, 3, 5]
counts=[0]*max(c) # gives [0, 0, 0, 0, 0, 0]
for i in range(len(c)):
counts[c[i]-1]+=1 # adds 1 to each index of c[i] (we subtract 1 because of 0-based indices)
print(counts) # gives us the answer: [0, 0, 4, 2, 3, 1]
</code></pre>
<p>我把这些步骤中的一些做得比你提出的挑战更为先进,如果这恰好是你的目标的话,我会阻止你在作业中使用这些步骤。在这个解决方案中使用的一些工具至少比您正在使用的工具要先进一点,但是如果您只是为了理解代码而学习Python,那么我希望这将是最有启发性的,可能会让您想到一些非常酷的东西,您可以用Python简明地做。尽管如此,让我们来看看:</p>
<p>我假设<code>st</code>赋值足够清楚,我们不需要讨论它,但是请注意,当我赋值时,它就在那里被拆分了。我只是在偷懒,我们可以分两步来做,但这不是问题的症结所在,让我们继续。</p>
<pre><code>c=[len(i) for i in st]
</code></pre>
<p>只意味着“对于每个元素,我们称之为<code>i</code>,在<code>st</code>中,在列表中返回<code>len(i)</code>,并使该列表成为<code>c</code>”。这可能看起来让人望而生畏,但是列表理解并没有那么糟糕,正如您所看到的,它们为您节省了大量的编码时间。这是一个相当温和的实现,真的。</p>
<pre><code>counts=[0]*max(c)
</code></pre>
<p>表示在每个空间中用<code>0</code>s创建一个列表,并使其重复多次是<code>c</code>的<code>max</code>。所以这将需要最长的单词,在本例中是6个字母的单词'really',并使列表中的6个元素变长。这将确保我们有一个列表,其中包含我们遇到的每个长度词的空格。</p>
<pre><code>for i in range(len(c)):
counts[c[i]-1]+=1
</code></pre>
<p>哦,天哪,现在我们在做饭。请注意,我们正在遍历列表<code>c</code>,因此我们遍历的每个项都是相应单词的长度:</p>
<ul>
<li>第一个元素是<code>3</code>,对应于<code>Did</code>。</li>
<li>第二个元素是<code>3</code>,对应于<code>the</code>。</li>
<li>。。。</li>
<li>最后一个元素是<code>5</code>,对应于<code>fence</code>。</li>
</ul>
<p>这就是<code>c[i]</code>的意义,但是<code>counts[c[i]-1]</code>是什么?好的,<code>counts</code>将把<code>1</code>加到你找到的每个长度上,所以当一个有3个字符长的单词时,它会把<code>1</code>加到一个bin中。<code>c[i]</code>将在第一个元素上为您提供<code>3</code>,但是由于列表是0索引的(列表从0开始并从0向上),您需要进行补偿,因此<code>-1</code>。所以我们看到了<code>counts[c[i]-1]</code>,现在它变得更有意义了,对吧?</p>
<pre><code>counts[c[i]-1] # this means counts[3-1] which means go find the bin corresponding to counts[2]
# ---v this one
[0,0,0,0,0]
</code></pre>
<p>而<code>+=1</code>简单的意思是“在已经存在的东西上加1”。</p>
<p>Python会很高兴地遍历它并给出答案。</p>