0

我有一串带有标点符号的单词,例如...

string = 'Did the quick brown fox *really* jump over the fence?'

我已经过滤掉了标点符号,所以现在是:

'Did the quick brown fox really jump over the fence'

我已经把它分成了一个列表。

list = string.split()

现在,有了list,我现在需要将每个单词的长度计算到一个列表中,列表的长度是最长的单词。列表中的设置如下:

lengthList = [1_letter_words, 2_letter_words, 3_letter_words, ...]

因此,对于string,它将是:

lengthList = [0, 0, 4, 2, 3, 1]

不幸的是,我在这样做时遇到了麻烦。任何人都可以提供任何帮助吗?

谢谢你。

4

5 回答 5

1

我不想在没有给您正确答案的情况下对您大喊大叫(完全没有,但肯定不会),所以如果您不关心良好的编码实践,请跳过。

不要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 个元素。这将确保我们有一个列表,其中包含我们遇到的每个长度单词的空格。maxc

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 会很高兴地遍历它并给你答案。

于 2013-08-24T00:18:40.707 回答
1
from collections import Counter
Data = 'Did the quick brown fox really jump over the fence'
Freq = Counter([len(words) for words in Data.split()])
print ([Freq[Num] if Num in Freq else 0 for Num in range(1, max(Freq)+1) ])

输出

[0, 0, 4, 2, 3, 1]

易于理解的版本

from collections import Counter
Data = 'Did the quick brown fox really jump over the fence'
Freq = Counter([len(words) for words in Data.split()])
Result = []
for Num in range(1, max(Freq)+1):
    if Num in Freq:
        Result.append(Freq[Num])
    else:
        Result.append(0)
print (Result)
于 2013-08-24T04:07:04.617 回答
0

就像是:

>>> words = [len(word) for word in "this is a sentence".split()]
>>> words.sort()
>>> words
[1, 2, 4, 8]
于 2013-08-24T00:14:48.050 回答
0
string = 'Did the quick brown fox really jump over the fence'
L = string.split()
D = {}    
res = []

for w in L: #store words lenght as keys and repetition as values 
    if len(w) in D:
        D[len(w)] += 1 #increase by one if had seen word with same lenght.
    else:
        D[len(w)]  = 1 #initialize hash with value one if had not seen word with that length  before. 

res = [D.get(x, 0) for x in range(1, max(D.keys()) + 1)]

print(res)
#[0, 0, 4, 2, 3, 1]
于 2013-08-24T01:19:00.953 回答
0
original_str = "This is a demonstration"
num_words_list = list(original_str.split())
num_words_list = [len(i)for i in num_words_list]
于 2019-10-18T12:32:03.997 回答