Recherche de caractères spécifiques dans une liste


11

Le but est de faire une liste à partir du paragraphe de l'utilisateur et de l'itérer afin que je puisse compter combien de mots contiennent des lettres spéciales "j, x, q, z".

Exemple d'entrée:
Dans un trou dans le sol, vivait un hobbit. Pas un trou méchant, sale et humide, rempli des extrémités de vers et d'une odeur suintante, ni encore un trou sec, nu et sablonneux sans rien pour s'asseoir ou manger; c'était un trou de hobbit, et cela signifie confort.

Exemple de sortie: 1 mot avec un caractère rare

J'ai commencé le code où je casse le paragraphe de l'utilisateur dans une liste mais j'ai du mal à parcourir la liste et à trouver chaque instance des lettres spéciales.

Voici ce que j'ai jusqu'à présent:

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 je lance avec l'exemple d'entrée, j'obtiens une sortie de '0 mot (s) avec un caractère rare'. Comment pourrais-je résoudre ce problème afin que je puisse obtenir la sortie attendue. Toute aide serait grandement appréciée car je suis encore relativement nouveau dans le codage

Aussi une note rapide: je ne suis autorisé qu'à utiliser les méthodes / fonctions de split () et Len ()


.indexdevrait faire le travail
bigbounty

Vous devez parcourir la sortie et ajouter des instructions d'impression pour vous assurer que les instructions et les conditions sont remplies.
Fallenreaper

faute de frappe. la ligne au-dessus de la boucle intérieure ne devrait-elle pas être wds = astring.split ()
abhilb

Quel est le but de for astring in words:?
norok2

D'après les noms de variables, je pense que vous êtes confus. Remplacez «pour astring en mots:» par «pour mot en mots.split ():». Puis "pour char dans wds:" vers pour char dans word: ". Et supprimez" wds = words.split () ".
kantal

Réponses:


4

Cela pourrait peut-être être l'occasion de vous présenter quelques fonctionnalités 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"

Cette réponse utilise:

  1. la dactylographie , qui peut être utilisée par des outils tiers tels que les vérificateurs de type, les IDE, les linters, mais plus important encore pour faire clairement part de vos intentions aux autres humains qui pourraient lire votre code.
  2. arguments par défaut , au lieu de les coder en dur dans la fonction. Il est très important de documenter vos fonctions, afin qu'un utilisateur ne soit pas surpris par le résultat (voir Principe du moindre étonnement ). Il existe bien sûr d'autres façons de documenter votre code (voir docstrings ) et d'autres façons de concevoir cette interface (ce pourrait être une classe par exemple), mais c'est juste pour démontrer le point.
  3. Répertorier les compréhensions , ce qui peut rendre votre code plus lisible en le rendant plus déclaratif plutôt qu'impératif . Il peut être difficile de déterminer l'intention derrière les algorithmes impératifs.
  4. interpolation de chaînes , qui selon mon expérience est moins sujette aux erreurs que la concaténation.
  5. J'ai utilisé le guide de style pep8 pour nommer les fonctions, qui est la convention la plus courante dans le monde python.
  6. Enfin, au lieu d'imprimer, j'ai renvoyé un strdans la cool_parafonction car le code sous le # DO NOT CHANGE CODE BELOWcommentaire imprime le résultat de l'appel de fonction.

1
L'une des meilleures implémentations que j'ai vues jusqu'à présent. Ne pourrait pas être plus Pythonic. :-) Je voudrais juste renommer rare_chars()à la find_rare_words()place.
accdias

1

Idéalement, vous souhaitez utiliser la compréhension de liste.

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

Cela vous donne:

['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

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: ")))

Entrée: Bonjour, c'est une phrase sur les zoos

Sortie: 1 mot (s) avec un caractère rare


0

Le code suivant est une modification de la vôtre qui se traduit par la bonne réponse 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()

Réponse:

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

0

Ce code fonctionnera pour vous. Ne marquez pas l'entrée des mots et remarquez la chaîne de mots que j'ai utilisée pour tester le code.

La méthode para n'est pas nécessaire.

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")

0

La solution proposée par Barb fonctionne pour une seule lettre:

CoolPara ('f')

Mais cela ne fonctionne pas avec plusieurs personnages comme l'a demandé l'affiche originale. Par exemple, cela ne renvoie pas les résultats corrects:

CoolPara ("jxqz")

Voici une version légèrement améliorée de la solution 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))
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.