¿Cómo contar la letra más frecuente en una cuerda?

class MyString: def __init__(self, myString): self.__myString = myString def countWord(self): count = len(self.__myString.split()) return count def findMostFrequentChar(self): # ? 

Necesito implementar findMostFrequenctChar . La única pista que nos dio fue que necesitábamos hacer 2 listas. y aquí es donde ella me perdió.

Aquí está el código que llama a la función:

 def main(): aString = MyString("This is a super long long long string. Please help count me") print("There are", aString.countWord(), "words in the string.") count, letter = aString.findMostFrequentChar() print("The most frequent character is", letter, "which appeared", count, "times") main() 

Yo usaría un dict para almacenar el conteo. Pero primero quiero eliminar todos los spaces y otros símbolos y luego az, también quiero contar las letras mayúsculas y minúsculas como una y la misma.

Cuando el dict se construye con todos mis valores, uso la función max . El max toma un iterable, por lo que pasamos dict como una “lista” de tuplas (key, val) . Necesitamos decirle a max cómo determinar lo que queremos comparar, para eso le damos una función lambda que lleva el segundo elemento ( val ) de la tupla al key-arg .

A cambio, max escupirá la tupla con el valor más alto.

 class MyString: def __init__(self, myString): self.__myString = myString def countWord(self): count = len(self.__myString.split()) return count def findMostFrequentChar(self): counter = {} # Instead of performing various modifications on the string # one can instead filter all the undesired chars. # new_string = self.__myString.replace(' ', '').lower() new_string = list(filter(lambda x: 'a' >= x <= 'z', self.__myString.lower())) for char in new_string: if char in counter: counter[char] += 1 else: counter[char] = 1 key, value = max(counter.items(), key=lambda x:x[1]) return value, key def main(): aString = MyString("This is a super long long long string. Please help count me") print("There are", aString.countWord(), "words in the string.") count, letter = aString.findMostFrequentChar() print("The most frequent character is", letter, "which appeared", count, "times") main() 

La única pista que nos dio fue que necesitábamos hacer 2 listas. y aquí es donde ella me perdió.

Eso parece implicar que no puedes usar collections.Counter . collections.Counter , y probablemente ni siquiera diccionarios.

Si podemos asumir que las letras se definen como el alfabeto inglés, entonces una lista es suficiente. En ese caso, podría crear una lista de 26 elementos, todos inicializados a 0. Luego, podría iterar sobre los caracteres de la cadena y, para cada letra del alfabeto inglés, incrementar el conteo del n -ésimo elemento en la lista , donde n es el índice de la letra en el alfabeto.

Crear una lista de 26 ceros:

 counts = [0] * 26 

Recorre los caracteres de la cadena de entrada s :

 for c in s: 

Comprueba que el personaje es una letra:

 if 'a' <= c.lower() <= 'z' 

Calcule el índice basado en 0 de la letra en el alfabeto e incremente la cuenta:

 index = ord(c.lower()) - ord('a') counts[index] += 1 

Una vez que tenga los conteos, puede encontrar el índice que tiene el valor máximo (que le queda como ejercicio) y obtener el carácter correspondiente con chr(index + ord('a')) .

Puede utilizar sorted :

 class String: def __init__(self, s): self.s = s def findMostFrequentChar(self): return sorted([(a, self.s.count(a)) for a in self.s], key=lambda x:x[-1])[-1] 

Si pudieras usar el módulo Counter desde collections :

 from collections import Counter def findMostFrequentChar(self): d = Counter(self.__myString.replace(' ', '').lower()) return d.most_common()[0] 

Si Counter está fuera de la cuestión:

 def findMostFrequentChar(self): d = {} for ch in self.__myString.replace(' ', '').lower(): if ch in d: d[ch] += 1 else: d[ch] = 1 most_frequent = max(d, key=d.get) return most_frequent, d[most_frequent] 

Poniéndolo en conjunto:

 class MyString: def __init__(self, myString): self.__myString = myString def countWord(self): count = len(self.__myString.split()) return count def findMostFrequentChar(self): d = {} for ch in self.__myString.replace(' ', '').lower(): if ch in d: d[ch] += 1 else: d[ch] = 1 most_frequent = max(d, key=d.get) return most_frequent, d[most_frequent] def main(): aString = MyString("This is a super long long long string. Please help count me") print("There are", aString.countWord(), "words in the string.") letter, count = aString.findMostFrequentChar() print("The most frequent character is", letter, "which appeared", count, "times") main() 

Le mostraré cómo obtener la letra más frecuente de una cadena regular utilizando un diccionario sin ninguna importación. Su trabajo es ajustar su clase en consecuencia.

Supongo que si dos o más letras comparten la frecuencia más alta, cualquiera de ellas es un resultado válido.

 >>> s = 'aabacbcd' >>> counts = {} >>> for c in s: ... counts[c] = counts.get(c, 0) + 1 ... >>> counts {'a': 3, 'c': 2, 'b': 2, 'd': 1} >>> max(counts, key=counts.get) 'a' 

La parte de “dos listas” es irritante. Sin embargo, una herramienta práctica para contar elementos de iterables en Python son las collections.Counter .

 from collections import Counter # ... def findMostFrequentChar(self): return Counter(self.__myString).most_common()[0][0]