Python如何统计一个包含多种变量类型的列表中字符串的数量,如果可能的话不使用循环。

3

希望可以统计变量类型列表中字符串的数量,如果可能的话不使用循环:

l = [1,2,3,'a','b']
c = l.count(str)
print (c)

输出:

0

预期输出:

2

3
list(map(type, l)).count(str)的作用是计算列表l中类型为str的元素个数,但使用循环更加清晰简洁。 - vaultah
@vaultah,速度很快,谢谢。我猜这会生成一个类型列表l,以便.count(str)可以实际计算类型? - ragardner
1
如果您不想创建一个列表,可以使用sum(1 for x in l if type(x) == str)。如果您想要创建一个列表,则可以使用sum([1 for x in l if type(x) == str]) - shahkalpesh
2个回答

3

由于Guido不太喜欢mapfilter,因此我将提供一个避免使用它们的答案:

len([v for v in k if isinstance(v, str)])

这仅计算字符串。这是浪费的,因为它在内存中构建了一个完整的列表。没有干净利落地获取生成器长度的方法,但有一些技巧。

sum(isinstance(v, str) for v in k)

这个方法可行是因为布尔值的总和是 True 值的数量,因此也是字符串的数量。感谢 vaultah 评论中的澄清。

1
需要构建一个列表来计算出现次数吗? - vaultah
1
哦,绝对不是。我会认为你的方法更加优美和高效;我只是想提供一些备选方案。 - Arya McCarthy
3
我并没有指的是我的代码——实际上它也创建了一个列表。由于你选择使用显式循环,你可以这样做:sum(isinstance(v, str) for v in k),这应该至少是内存有效的。 - vaultah

-2

我的解决方案可能有点繁琐,但这是我的尝试

l = [1,2,3,'a','b']

将列表中的所有元素连接成一个字符串

ll = ''.join(map(str,l))

然后对它进行计数

letters = sum(c.isalpha() for c in ll)

1
你的代码对于 [1,2,3,'a','ab'] 返回了 3,这可能不是预期的行为。另外,你的意思是 ll = ''.join(map(str,l)),对吗? - frederick99
嗨@frederick99,我的代码对于OP所要求的工作正常运行;)。感谢您的修正。 - Andy K
1
在列表中计算字符串的数量。我认为你的代码没有做到这一点!不客气。;) - frederick99

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