【问题标题】:Counting how many chars of the alphabet are in a string计算一个字符串中有多少个字母
【发布时间】:2019-11-03 20:35:14
【问题描述】:

我想计算一个字符串中有多少个字母 [a...z],我不关心“!”要么 ”?”或“\n”、“”、“.”和许多其他人。我只想要字母。

我试图使用 collections.Counter(string) 但问题是 Counter 正在获取这些不需要的字符,我不知道如何不考虑它们。

另一个问题是,在我的真实习惯中,我们不仅使用“o”,还使用“ô”和“ó”以及“e”、“é”或“ç”。在这些情况下,必须考虑这些字符。

我该怎么做?

【问题讨论】:

  • 使用collections.Counter,然后删除你不关心的元素。
  • 给定一个字符串,例如'aèîghk,l!;'lo',你希望输出是什么?
  • ôo 的计数应该合并还是分开?
  • gmds:我认为这没关系,因为,让我们考虑一下banâná(写错了但是......)如果你计算 a=1 â=1 和 á=1,它的大小不会改变.总和是一样的。
  • cs95:我认为应该是 9。应该只考虑 aèîghkllo 我不想要 ',!;

标签: python string counter


【解决方案1】:

使用collections.Counter后去掉非字母。

import collections
import string

counter = collections.Counter(yourString)
for char in counter.keys():
    if not isalpha(char):
        del counter[char]

这将分别对抗大写和小写字母,以及具有不同重音和变音符号的字母。如果要忽略大小写,可以使用collections.Counter(yourString.lower())。如果您还想忽略变音符号,请使用collections.Counter(yourString.encode('ascii', 'ignore').decode().lower())

【讨论】:

  • 你的意思是char.isalpha()
  • 这是在正确的轨道上,但 we use not only "o" but "ô" and "ó" as well as "e", "é", or "ç". In these cases these chars must considered. 没有被考虑在内。此外,您可以考虑降低字符串。 Counter(text.encode('ascii', 'ignore').decode().lower())
  • @cs95 我认为isalpha() 对这些角色来说是正确的。
  • 是的,但是它们会被算作不同的字符,不是吗?
  • @cs95 我不认为他想合并它们的计数,他只是想将它们包含在结果中。
【解决方案2】:

如果您只想计算唯一字符,可以在字符串中的字符集和您接受的字符集之间使用 set.intersection:

可能是这样的:

import string

acceptable_chars = set('áàéíóúç').union(set(string.ascii_lowercase))
mystring = 'kfh;l1234sóúçids'
num_alpha = len(set(mystring.lower()).intersection(acceptable_chars))
print(num_alpha)

输出:

10

【讨论】:

  • 但如果 mystring 有 á, à, é, í, ó, ú 甚至 ç 他们将不会被考虑。
  • 您可能需要构建一组您可以接受的字符。见编辑。
  • 是的,这就是我所做的:所有字母(小写)string.ascii_lowercase,合并您列出的特殊字符。
【解决方案3】:

给定

import string
import collections as ct


s = "Lorem ipsum çéó?"

代码

制作一组accepted 字符——排除你不想要的;包括你想要的。

excluded = set("oe")
included = set("ôóéç")
accepted = set(string.ascii_letters) - excluded | included 

计算并屏蔽接受的字符。

counted = ct.Counter(s)
masked = ct.Counter(accepted)
shared = set((counted & masked).elements())

从 Counter 中过滤接受的字符。

演示

字符总和

sum(v for k, v in counted.items() if k in shared)
# 11

唯一字符的总和

sum(1 for k, _ in counted.items() if k in shared)
# 10

统计字符的字典

{k: v for k, v in counted.items() if k in shared}
# {'L': 1, 'r': 1, 'm': 2, 'i': 1, 'p': 1, 's': 1, 'u': 1, 'ç': 1, 'é': 1, 'ó': 1}

【讨论】:

    【解决方案4】:

    所以,伙计们!

    我将 Reblochon Masque 的答案标记为正确,因为我认为是正确的。但是在测试了更多之后,我发现我错了。所以我根据他的代码做了自己的解决方案。

    该代码的问题是,如果我的字符串像他的示例一样是“kfh;l1234sóúçids”,则输出是正确的,10。但如果我用空格重复它,例如:“kfh;l1234sóúçids kfh;l1234sóúçids”我得到 10再次,应该是 20。

    所以,我的解决方案是像他的代码一样创建一组可接受的字符并将其用作参考。

    这里:(在我的例子中,输出是 11,因为我在集合中添加了一些特殊字符。

    import collections
    import string
    
    # This counter is considering only acceptable_chars. All the rest is ignored.
    def numChars(sentence):
        acceptable_chars = set('áàéíóúç').union(set(string.ascii_lowercase))
        chars = collections.Counter(sentence)
        acum = 0
    
        for key in acceptable_chars:
            if key in chars:
                acum += chars[key]
    
        return acum
    
    
    x = numChars("kfh;l1234sóúçids")
    print("Acum: " + str(x))
    

    输出:

    Acum: 11
    

    如果字符串是'kfh;l1234sóúçids \n kfh;l1234sóúçids':

    Acum: 22
    

    【讨论】:

      猜你喜欢
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 2016-07-25
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多