【问题标题】:Count occurrences of a substring in a list of strings计算字符串列表中子字符串的出现次数
【发布时间】:2020-06-12 21:17:43
【问题描述】:

我知道计算列表项的简单出现次数很简单:

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

但我想知道如何做的是每次字符串出现在列表条目的子字符串中时计数。

比如我想看看foodata列表中出现了多少次:

data = ["the foo is all fooed", "the bar is all barred", "foo is now a bar"]

在做:

d_count = data.count('foo')
print("d_count:", d_count)

产生:

d_count: 0

但我希望得到:

d_count: 2

我也试过这样做:

d_count = data.count(any('foo' in s for s in data))
print("d_count:", d_count)

但结果也是零。

我想知道如何计算列表中出现的每个子字符串。

【问题讨论】:

标签: python


【解决方案1】:

您可以通过使用sum 内置函数来做到这一点。也不需要使用list.count

>>> data = ["the foo is all fooed", "the bar is all barred", "foo is now a bar"]
>>> sum('foo' in s for s in data)
2
>>>

此代码有效,因为布尔值可以被视为整数。每次'foo' 出现在字符串元素中时,都会返回TrueTrue 的整数值为 1。所以就好像每次'foo' 在一个字符串中,我们都会返回1。因此,将返回的1 相加将得出1 在元素中出现的次数。

编写上述代码的一种可能更明确但等效的方法是:

>>> sum(1 for s in data if 'foo' in s)
2
>>> 

【讨论】:

  • 完美运行,sum 命令,非常感谢。我想会有一些简单的命令可以解决我根本不知道的问题。
  • 很高兴我可以帮助@theprowler ;-)
  • 最后一种方法看起来很可疑。如果其中一个字符串以“fo”结尾而下一个字符串以“o”开头怎么办?它还会为其他方法提供不同的结果,因为它会计算 all 的出现次数(并且它只会找到整个单词而不仅仅是子字符串)。
  • @ekhumoro 我没有关注您评论的第一部分。如果一个字符串以“fo”结尾,而下一个字符串以“o”开头,那么该方法不会将它们计为“foo”,这是正确的,不是吗?不过,这些是您提出的一些有效观点。我将添加关于最后一种方法的行为的警告。
  • 哇 - 我刚刚尝试了True + True,它返回了2。这听起来像是我对 Javascript 所期望的一些废话。我对 Python 的喜爱程度略有下降,我想……
【解决方案2】:

你可以试试这个:

from itertools import chain

data = ["the foo is all fooed", "the bar is all barred", "foo is now a bar"]

data = list(chain.from_iterable([i.split() for i in data]))

print(data.count("foo"))

输出:

2

【讨论】:

    【解决方案3】:

    @ChristianDean 的回答很棒,但是很难阅读(至少对我而言)。所以这里有一个更易读/更容易理解的版本。

    count = 0
    for s in data:
        if 'foo' in s:
            count += 1
    

    【讨论】:

      【解决方案4】:

      如果 data = ["abababa in foo", "abababa"]

      从列表中找到 "aba" 的出现, 你应该使用下面的代码:

      >>> data = ["abababa in foo", "abababa"]
      >>> str = "aba"
      >>> length = len(str)
      >>> sum(element[index:index+length] == str for element in data for index,char in enumerate(element))
      6
      

      【讨论】:

        猜你喜欢
        • 2020-02-21
        • 2012-02-12
        • 1970-01-01
        • 2014-04-24
        • 2022-01-09
        • 1970-01-01
        相关资源
        最近更新 更多