计算列表中某个项目的重复次数

3
l = "Hello world is me"
words_ = l.split()
print(l.split())

for item in words_ :
    if len(item) < 5 :
        print('Words with length less than 6:', item )
    elif len(item) == 5 :
        print('Words with length 5:', item )

这是我的代码,但我希望它打印出指定长度的单词数,而不是打印单词本身。有什么建议吗?

1
sum(1 for w in l.split() if len(w)==5) 应该可以。 - Jean-François Fabre
5个回答

1
你可以在循环中计算单词数,但更符合Python风格的做法是使用生成器推导式过滤单词长度后将其传递给sum函数。
>>> l = "Hello world is me"
>>> sum(1 for w in l.split() if len(w)==5)
2

另一种变体是将测试结果转换为布尔值(这里测试结果已经是布尔值,因此无需使用bool()),并进行求和:
sum(len(w)==5 for w in l.split())

这种方法适合测试一个条件,但如果你想要同时计算满足多个条件的单词数量(例如len < 5len == 5),传统的循环仍然是最佳选择,因为它只对列表进行一次迭代,并且你可以自然地使用短路运算和if/elsif语句,对于列表推导式来说就有点遗憾了,但这就是生活:

less_than_5=exactly_5=0
for item in l.split() :
    if len(item) < 5 :
        less_than_5 += 1
    elif len(item) == 5 :
        exactly_5 += 1

@MosesKoledoye:这里确实没有理由,一个潜在的问题是人们可能会将其推广到布尔值的“真实性”,这样就可能出错。 - Willem Van Onsem
@WillemVanOnsem 我不认为会出错。或者可能是我没有理解你的意思 :) - Moses Koledoye
尝试使用sum(x for x in l.split()),例如。即使x是真或假,它也会失败。我认为这就是Willem的意思。 - Jean-François Fabre
@MosesKoledoye:如果我们不使用bool(..),那么一个人可能会认为sum(..)作为计数器工作。因此,sum(len(x) for x in a)计算a中具有真实性Truelen(x)的元素数量。当然,这并不是事实。我不是说这个答案表明了这一点,但它可能有点令人困惑。但我已经+1了,所以没问题 :)。 - Willem Van Onsem

1

您可以使用以下方法计算满足条件的元素数量:

sum(<i>condition</i> for <i>item</i> in <i>iterable</i>)

请注意,这里的condition必须是布尔值(因为True1,而False0,所以它将总结True并计算条件满足的次数)。
因此,如果您想计算长度小于五个字符的元素数量,可以编写以下代码:
number_of_words = sum(<b>len(word) < 5</b> for <b>word</b> in <b>words_</b>)

或者针对长度为五个字母的单词数量:

number_of_words = sum(<b>len(word) == 5</b> for <b>word</b> in <b>words_</b>)

etc.


1

除了现有的答案,您还可以使用filterlambda函数来获取计数:

# Python 2.x
l = "Hello world is me"
words_ = l.split()
print "There are", len(filter(lambda x: len(x) < 5, words_)), "words less than 5 long"
print "There are", len(filter(lambda x: len(x) == 5, words_)), "words exactly 5 long"

# Python 3.x
l = "Hello world is me"
words_ = l.split()
print ("There are", len(list(filter(lambda x: len(x) < 5, words_))), "words less than 5 long")
print ("There are", len(list(filter(lambda x: len(x) == 5, words_))), "words exactly 5 long")

1
请注意,这仅适用于Python-2.x,因为在Python-3.x中,“filter”返回一个可迭代对象,而不是列表。 - Willem Van Onsem
@WillemVanOnsem,没有括号的打印语句甚至会在那之前就停止你 :) - Jean-François Fabre
编辑后包括 Python 3 版本 - scwagner

1
我会先建立一个计数器(Counter),这样提取所需信息就变得容易了。
>>> from collections import Counter
>>> s = "Hello world is me"
>>> c = Counter(len(x) for x in s.split())
>>> c
Counter({2: 2, 5: 2})

或者,您可以使用HTML构建计数器

c = Counter(map(len, s.split()))
< p > Counter 告诉您,您的句子有两个长度为2的单词和两个长度为5的单词。

获取长度小于五的单词数:

>>> sum(num_words for length, num_words in c.items() if length < 5)
2

由于当查找缺失的键时,Counter 默认返回 0,因此您可以通过发出以下命令获得相同的结果:

>>> sum(c[length] for length in range(1, 5))
2

第二个选项可能比第一个选项更易读。

获取长度为5的单词数量非常容易:

>>> c[5]
2

0

你需要先找到每个单词的长度,然后根据单词的长度进行计数。

使用 range()max()sum() 内置函数 可以大大简化代码:

l = "Hello world is me"
words = l.split()
print(l.split())

# create a dict to count words with the same length
lengths = dict.fromkeys(
    range(1, max(len(word) for word in words) + 1),  # range's stop is exclusive
    0,  # default value
)

# count words' length
for word in words:
    lengths[len(word)] += 1

# count all words with length < 6
print(
    'Words with length less than 6:',
    sum(value for key, value in lengths.items() if key < 6)
)

# count all words with length == 5
print(
    'Words with length 5:',
    lengths.get(5, 0)  # faster than sum()
)

将会打印:

['Hello', 'world', 'is', 'me']
Words with length less than 6: 4
Words with length 5: 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接