查找字符串中出现次数最多的字符

问题描述 投票:0回答:7

这段代码将找到字符串中出现次数最多的字符,并且通过字典几乎可以正常工作,但不幸的是,问题是当有两个键具有相同频率时,我想让它返回最后一个键,但它返回第一个。

这就是我到目前为止所做的:

def most_frequent_letter(s):
    st = s.lower().replace(' ', '')
    frequencies = {}
    for items in st:
        if items in frequencies:
            frequencies[items] += 1
        else:
            frequencies[items] = 1

    return max(frequencies, key=frequencies.get)




most_frequent_letter('mmmaaa')
Out[48]: 'm'

但是我不知道如何返回 'a' 而不是 'm'。

python string dictionary
7个回答
1
投票

这是创建反向频率字典的方法。我还通过使用字典理解

使频率字典及其反向的创建变得相当简洁。
def most_frequent_letter(s):
    st = s.lower().replace(' ', '')
    frequencies = {}
    frequencies = {item: frequencies.setdefault(item, 0) + 1 for item in st}
    rev_freq = {count: key for key, count in frequencies.items()}
    return rev_freq[max(rev_freq)]

print(most_frequent_letter('nnmmmaaa'))  # -> a

1
投票

Python max 函数始终返回第一个最大出现次数。 因此,如果您总是想要最后一个键,那么您可以在代码中反转原始字符串。

def most_frequent_letter(s):
    st = s.lower().replace(' ', '')
    st = st[::-1]
    frequencies = {}
    for items in st:
        if items in frequencies:
            frequencies[items] += 1
        else:
            frequencies[items] = 1

    return max(frequencies, key=frequencies.get)

或者如果您想要最低值的键,请先对字符串进行排序。 您也可以创建自己的 max 函数来满足您的需求。


1
投票
def most_frequent_letter(word):
    letters = list(word)
    return (max(set(letters), key = letters.count))

print(most_frequent_letter('mmmaaa'))
# output:m
print(most_frequent_letter('some apples are green'))
# output: e

max() 将返回列表中的最高值。 key 参数采用单个参数函数来自定义排序顺序,在本例中为 letter.count。该函数应用于迭代器上的每个项目。

letters.count 是 list 的内置函数。它接受一个参数并计算该参数出现的次数。所以 letter.count('m') 将返回 3,letters.count(a) 将返回 3。

set(test) 返回 test 中的所有唯一值,因此 {3, 3}

所以我们在这行代码中所做的就是获取 test 的所有唯一值,即 {1, 3}。接下来,max将对它们应用list.count函数并返回最大值。


1
投票

collections
库有
Counter
可以为您完成这项工作:我们用小写字母标准化单词,并替换反向字符串之前的空格以首先出现最后一次。


from collections import Counter

word = 'mmmaaa'
characters = Counter(reversed(word.lower().replace(' ', '')))

# most common 
print(characters.most_common(1))


0
投票

是的,你可以同时得到 m 和 a,这取决于你想如何获得输出,但我只是举个例子

def most_frequent_letter(s):
    st = s.lower().replace(' ', '')
    frequencies = {}
    for items in st:
        if items in frequencies:
            frequencies[items] += 1
        else:
            frequencies[items] = 1
    max_val=max(frequencies.values())
    result=""
    for key,value in frequencies.items():
        if value==max_val:
            result+=key

    return result


result=most_frequent_letter('mmmaaa')
print(result)

输出将为“ma”


0
投票

在Python中,当您使用max函数时,它将返回第一个最大频率,如果您想要第二个最大频率,您可以尝试从列表中删除“m”,这样之后第一个最大频率将为“a”。


0
投票

字符串“abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz”中的所有字符恰好出现两次。 由于 'a' 的索引最低,因此字符 'a' 就是答案,因为字符串中字符的频率相同。

如果字符串中的字符出现频率不同,则将取字符串中出现频率最高的字符。

def maximumOccurringCharacter(text):
ASCII_SIZE = 256
ctr = [0] * ASCII_SIZE
max = -1
ch = ''

for i in text:
    ctr[ord(i)] += 1

for i in text:
    if max < ctr[ord(i)]:
        max = ctr[ord(i)]
        ch = i

return ch

ch =maximumOccurringCharacter('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz')
print(ch)

输出:a

底部是出现次数最多的字符的示例代码。

#字母=列表(文本)

#return (max(set(字母), key = 字母.count))

在Python中,当您使用max函数时,它将返回第一个最大频率,如果您想要第二个最大频率,您可以尝试从列表中删除“a”,这样之后第一个最大频率将为“b”。

© www.soinside.com 2019 - 2024. All rights reserved.