字符串中最常见的字母

时间:2014-12-29 18:23:51

标签: python python-3.x

完成练习以找到字符串中最常见的字母,不包括标点符号,结果应为小写。因此,在示例"HHHHello World!!!!!!!!!!"中,结果应为"h"

到目前为止我所拥有的是:

text=input('Insert String: ')
def mwl(text):
    import string
    import collections
    for p in text:
        p.lower()
    for l in string.punctuation:
        for x in text:
            if x==l:
                text.replace(x,'')
    collist=collections.Counter(text).most_common(1)
    print(collist[0][0])

mwl(text)

感谢您帮助理解原因:

  1. 案例未在text
  2. 中保持更低
  3. 标点符号未从text字符串
  4. 中永久删除

6 个答案:

答案 0 :(得分:1)

有几个问题:

  • 字符串是不可变的。这意味着lower()replace() 等函数会返回结果并保留原始字符串。您需要在某处分配该返回值。

  • lower()可以对整个字符串进行操作:text = text.lower()

有关如何从字符串中删除标点字符的一些想法,请参阅Best way to strip punctuation from a string in Python

答案 1 :(得分:1)

你可以试试这个:

>>> import re
>>> from collections import Counter
>>> my_string = "HHHHello World!!!!!!!!!!"
>>> Counter("".join(re.findall("[a-z]+",my_string.lower()))).most_common(1)
[('h', 4)]

答案 2 :(得分:0)

text = input('Insert String: ')

from string import punctuation
from collections import Counter
def mwl(text):
    st = set(punctuation)
    # remove all punctuation and make every letter lowercase
    filtered = (ch.lower() for ch in text if ch not in st)
    # make counter dict from remaining letters and return the most common
    return Counter(filtered).most_common()[0][0]

或使用str.translate删除标点符号:

from string import punctuation
from collections import Counter
def mwl(text):
    text = text.lower().translate(str.maketrans(" "*len(punctuation),punctuation))
    return Counter(text).most_common()[0][0]

使用您自己的代码,您需要将文本重新分配给更新的字符串:

def mwl(text):
    import string
    import collections
    text = text.lower() 
    for l in string.punctuation:
        for x in text:
            if x == l:
                text = text.replace(x,'')
    collist=collections.Counter(text).most_common(1)
    print(collist[0][0])

而不是循环遍历代码中的文本,您只需使用:

for l in string.punctuation:
     if l in text:
        text = text.replace(l,'')

答案 3 :(得分:0)

首要的问题是你从未真正分配任何东西。

 p.lower() 

只返回p的小写版本。它没有将p设置为小写版本。应该是

p = p.lower()

与text.replace(x,'')相同。它应该是     text = text.replace(x,'')

答案 4 :(得分:0)

你可以这样做:

>>> from collections import Counter
>>> from string import ascii_letters
>>> tgt="HHHHello World!!!!!!!!!!" 
>>> Counter(c.lower() for c in tgt if c in ascii_letters).most_common(1)
[('h', 4)]

答案 5 :(得分:0)

如果输入仅为ascii,那么您可以使用bytes.translate()将其转换为小写并删除标点符号:

#!/usr/bin/env python3
from string import ascii_uppercase, ascii_lowercase, punctuation

table = b''.maketrans(ascii_uppercase.encode(), ascii_lowercase.encode())
def normalize_ascii(text, todelete=punctuation.encode()):
    return text.encode('ascii', 'strict').translate(table, todelete)

s = "HHHHello World!!!!!!!!!!"

count = [0]*256 # number of all possible bytes
for b in normalize_ascii(s): count[b] += 1 # count bytes
# print the most common byte
print(chr(max(range(len(count)), key=count.__getitem__)))

如果你想计算非ascii Unicode文本中的字母,那么你可以使用.casefold() method(正确的无结果比较)和remove_punctuation() function

#!/usr/bin/env python3
from collections import Counter
import regex # $ pip install regex

def remove_punctuation(text):
    return regex.sub(r"\p{P}+", "", text)

s = "HHHHello World!!!!!!!!!!"
no_punct = remove_punctuation(s)
characters = (c.casefold() for c in regex.findall(r'\X', no_punct))
print(Counter(characters).most_common(1)[0][0])

r'\X'正则表达式用于计算用户感知的字符,而不仅仅是Unicode代码点。