我不想在没有给您正确答案的情况下对您大喊大叫(完全没有,但肯定不会),所以如果您不关心良好的编码实践,请跳过。
不要list
使用像和这样的变量名,string
因为 - 在这种情况下list
- 那是你正在制作的类型的名称。事实上,这就是你如何制作你正在制作的类型的空实例:
something=list() # this is an empty list!
这会使参考list[2]
或类似的东西变得混乱。所以你显然没有遇到任何错误,但是为了可读性,试着想出有意义的变量名。
好的,我的咆哮结束了,您正在寻找的代码是
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]
我做了一些比你提出的挑战更高级的步骤来阻止你在作业中使用它,如果这恰好是你的目标。此解决方案中使用的一些工具至少比您正在使用的工具更先进一点,但如果您只是为了理解代码而学习 Python,那么我希望这将是最有启发性的,也许会让您思考关于你可以用 Python 简洁地完成的一些非常酷的事情。说了这么多,让我们来看看:
我将假设st
分配足够清楚,我们不需要讨论它,但请注意,当我分配它时,我将其拆分。我只是懒惰,我们可以分两步完成,但这不是问题的核心,所以让我们继续。
c=[len(i) for i in st]
只是意味着“对于每个元素,我们将调用i
, in st
,给我len(i)
一个列表,并制作那个列表c
”。这可能看起来令人生畏,但列表推导式实际上并没有那么糟糕,而且正如您所看到的,它们为您节省了大量的编码时间。这是一个相当适度的实现,真的。
counts=[0]*max(c)
说要在每个空格中用 s 制作一个列表,并0
让它重复多次 所以这将采用最长的单词,在本例中是 6 个字母的单词“really”,并使列表长 6 个元素。这将确保我们有一个列表,其中包含我们遇到的每个长度单词的空格。max
c
for i in range(len(c)):
counts[c[i]-1]+=1
哦,男孩,现在我们正在做饭。看到我们正在遍历 list c
,所以我们通过它的每个项目都是相应单词的长度:
- 第一个元素是
3
,对应于Did
。
- 第二个元素是
3
,对应于the
。
- ...
- 最后一个元素是
5
,对应于fence
。
所以这c[i]
就是关于,但什么是counts[c[i]-1]
?Wellcounts
将添加1
到您找到的每个长度,因此1
当它有 3 个字符长的单词时,它会添加到 bin 中。c[i]
会给你3
第一个元素,但由于列表是 0 索引的(列表从 0 开始并从那里上升),你需要补偿 - 因此-1
. 所以我们看到counts[c[i]-1]
了,现在它更有意义了,对吧?
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]
并且+=1
只是意味着“将 1 添加到已经存在的任何内容”。
Python 会很高兴地遍历它并给你答案。