问题描述
说我有一个列表,我想计算部分字符串出现“ AB”的次数。有没有办法使count()起作用?我想尝试尽可能提高效率,而不必将代码分解成一个循环。
my_list = ["ABC","ABD","DCF","ARC","AVB","ABG"]
正确的输出= 3
解决方法
您可以使用sum内置函数。就您而言,
my_list = ["ABC","ABD","DCF","ARC","AVB","ABG"]
sum('AB' in s for s in my_list)
输出:3
此代码有效,因为布尔值可以视为整数。每次在字符串元素中出现“ AB”时,都会返回True。 True的整数值为1。因此,就像每次在字符串中输入“ AB”一样,都会返回1。因此,对返回的1求和将得出1在元素中出现的次数。
,您对["ABAB"]
的预期行为是什么?您要2
还是1
?如果您想要2
,仍然可以从“计数”中获得价值。
sum(s.count("AB") for s in my_list)
话虽这么说,您的问题似乎定义不清,如果您的字符串是“ AA”,您对["AAA","AA","A"]
期望多少? 1(准确)? 2(每件)? 3(所有可能的范围)?
遍历每个元素,如下所示:
sum(1 for i in my_list if "AB" in i)
或更长时间的选择:
count = 0
for i in my_list:
if "AB" in my_list[i]: count+=1
注意:我知道OP 不想要循环,但我认为没有一个循环就不可能。
,如果列表太多会影响时间效率,则可以并行处理。
- 初始化globalCounter
- 将列表分成n个块
- 对于每个块,生成一个线程并将其发送到内部运行循环以计算该块中“ AB”出现的函数
- 让每个线程都更新globalCounter
- 所有线程完成执行后,返回globalCounter作为结果
尽管这仍然可以有效遍历整个列表,但是并行化可以缩短时间。
,您可以将其转换为字符串并使用str.count
:
>>> my_list = ["ABC","ABG"]
>>> ' '.join(my_list).count('AB')
3
或者使用sum
和一个理解:
>>> sum(s.count('AB') for s in my_list)
3