Encontrar caracteres específicos dentro de una lista

11

El objetivo es hacer una lista del párrafo del usuario e iterar para que pueda contar cuántas palabras contienen letras especiales "j, x, q, z".

Ejemplo de entrada:
en un hoyo en el suelo, vivía un hobbit. No es un agujero desagradable, sucio y húmedo, lleno de puntas de gusanos y un olor a humedad, ni tampoco un agujero seco, desnudo y arenoso sin nada para sentarse o comer; Era un hobbit-hoyo, y eso significa comodidad.

Ejemplo de salida: 1 palabra con un carácter raro

Comencé el código donde rompo el párrafo del usuario en una lista, pero me resulta difícil iterar a través de la lista y encontrar cada instancia de las letras especiales.

Esto es lo que tengo hasta ahora:

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for astring in words:
        wds = words.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

def CoolPara(words):
    print(rareChar(words), 'word(s) with a rare character')

    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

Si ejecuto con la entrada de ejemplo, obtengo una salida de '0 palabra (s) con un carácter raro'. ¿Cómo podría solucionar esto para poder obtener el resultado esperado? Cualquier ayuda sería muy apreciada ya que todavía soy relativamente nuevo en la codificación.

También una nota rápida: solo se me permite usar los métodos / funciones de split () y Len ()

yariee
fuente
.indexdebería hacer el trabajo
bigbounty
Debe recorrer el resultado y agregar algunas declaraciones de impresión para asegurarse de que se cumplan las declaraciones y los condicionales.
Fallenreaper
error de tipografía. ¿No debería ser la línea sobre el bucle interno wds = astring.split ()
abhilb
¿Para qué sirve for astring in words:?
norok2
Por los nombres de las variables, creo que estás confundido. Cambie "por astring en palabras:" a "por word en words.split ():". Luego "for char in wds:" to for char in word: ". Y elimine" wds = words.split () ".
kantal

Respuestas:

4

Tal vez esta podría ser una oportunidad para presentarle algunas características de Python:

from typing import List


def rare_char(sentence: str, rare_chars: List[str]=["j", "x", "q", "z"]) -> List[str]:
    return [word for word in sentence.split() if 
            any(char in word for char in rare_chars)]


def cool_para(sentence: str) -> str:
    return f"{len(rare_char(sentence))} word(s) with rare characters"

Esta respuesta usa:

  1. mecanografía , que puede ser utilizado por herramientas de terceros como verificadores de texto, IDEs, linters, pero lo más importante es dejar en claro sus intenciones a otros humanos que podrían estar leyendo su código.
  2. argumentos predeterminados , en lugar de codificarlos dentro de la función. Es muy importante documentar sus funciones, para que un usuario no se sorprenda con el resultado (ver Principio de menor asombro ). Por supuesto, hay otras formas de documentar su código (ver cadenas de documentos ) y otras formas de diseñar esa interfaz (podría ser una clase, por ejemplo), pero esto es solo para demostrar el punto.
  3. Enumere las comprensiones , que pueden hacer que su código sea más legible al hacerlo más declarativo en lugar de imperativo . Puede ser difícil determinar la intención detrás de los algoritmos imperativos.
  4. interpolación de cadenas , que en mi experiencia es menos propensa a errores que la concatenación.
  5. He utilizado el PEP8 guía de estilo para nombrar las funciones, que es la convención más común en el mundo pitón.
  6. Finalmente, en lugar de imprimir, devolví un stren la cool_parafunción porque el código debajo del # DO NOT CHANGE CODE BELOWcomentario está imprimiendo el resultado de la llamada a la función.
Marco Vinícius Monteiro
fuente
1
Una de las mejores implementaciones que he visto hasta ahora. No podría ser más pitónico. :-) En su lugar, simplemente cambiaría el nombre rare_chars()a find_rare_words().
accdias
1

Idealmente, desea utilizar la comprensión de la lista.

def CoolPara(letters):
  new = [i for i in text.split()]
  found = [i for i in new if letters in i]
  print(new) # Optional
  print('Word Count: ', len(new), '\nSpecial letter words: ', found, '\nOccurences: ', len(found))

CoolPara('f') # Pass your special characters through here

Esto te da:

['In', 'a', 'hole', 'in', 'the', 'ground', 'there', 'lived', 'a', 'hobbit.', 'Not',
 'a', 'nasty,', 'dirty,', 'wet', 'hole,', 'filled', 'with', 'the', 'ends', 'of',
'worms', 'and', 'an', 'oozy', 'smell,', 'no', 'yet', 'a', 'dry,', 'bare,', 'sandy',
'hole', 'with', 'nothing', 'in', 'it', 'to', 'sit', 'down', 'on', 'or', 'to', 'eat;',
'it', 'was', 'a', 'hobbit-hole,', 'and', 'that', 'means', 'comfort']
Word Count:  52
Special letter words:  ['filled', 'of', 'comfort']
Occurences:  3
Lengüeta
fuente
0
def rareChar(words):
rareWords = 0
rareChars = ['j', 'x', 'q', 'z']

#Split paragraph into words
words.split()
for word in words:
    #Split words into characters
    chars = word.split()
    for char in chars:
        if char in rareChars:
            rareWords = rareWords + 1
return rareWords

def CoolPara(words):
    #return value rather than printing
    return '{} word(s) with a rare character'.format(rareChar(words))


# DO NOT CHANGE CODE BELOW

print(CoolPara(input("Enter: ")))

Entrada: Hola, esta es una oración sobre zoológicos

Salida: 1 palabra (s) con un caracter raro

KILLtheWEEZEL
fuente
0

El siguiente código es una edición tuya que da como resultado la respuesta correcta de 1

def main():

    def rareChar(words):
        rareWords = 0
        rareChars = ['j', 'x', 'q', 'z']

        all_words = list(words.split())

        for a_word in all_words:
            for char in a_word:
                if char in rareChars:
                    rareWords = rareWords + 1
        return rareWords

    def CoolPara(words):
        print(rareChar(words), 'word(s) with a rare character')


    # DO NOT CHANGE CODE BELOW

    print(CoolPara(input("Enter: ")))

main()

Responder:

C:\Users\Jerry\Desktop>python Scraper.py
Enter: In a hole in the ground there lived a hobbit. Not a nasty, dirty, wet hole, filled with the ends of worms and an oozy smell, no yet a dry, bare, sandy hole with nothing in it to sit down on or to eat; it was a hobbit-hole, and that means comfort.

1 word(s) with a rare character
wundermahn
fuente
0

Este código funcionará para ti. Desmarque la entrada de palabras y comente la declaración de cadena de palabras que usé para probar el código.

El método para no es necesario.

def rareChar(words):
    rareWords = 0
    rareChars = ['j', 'x', 'q', 'z']
    for word in words:
        wds = word.split()
        for char in wds:
            if char in rareChars:
                rareWords = rareWords + 1
    return rareWords

words = 'john xray quebec zulu'
# words = (input("Enter: "))

x = rareChar(words)
print(f"There are {x} word(s) with a rare character")
VC Healy
fuente
0

La solución proporcionada por Barb funciona para una sola letra:

CoolPara ('f')

Pero no funciona con varios personajes como lo solicitó el póster original. Por ejemplo, esto no devuelve los resultados correctos:

CoolPara ("jxqz")

Aquí hay una versión ligeramente mejorada de la solución de Barb:

def CoolPara(letters):
    new = [i for i in text.split()]
    found = list()
    for i in new:
        for x in i:
            for l in letters:
                if x == l:
                    found.append(i)
    print("Special letter words: ", found)
    print("word(s) with rare characters ", len(found))
shantanuo
fuente