如何计算部分字符串出现在列表中的次数?

问题描述

我有一个列表,我想计算部分字符串出现“ 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