Trovare caratteri specifici all'interno di un elenco


11

L'obiettivo è fare un elenco dal paragrafo dell'utente e iterare in modo da poter contare quante parole contengono lettere speciali "j, x, q, z".

Esempio di input:
in un buco nel terreno, viveva uno hobbit. Non un buco cattivo, sporco, bagnato, riempito con le estremità dei vermi e un odore trasandato, né ancora un buco secco, nudo, sabbioso con niente in esso su cui sedersi o mangiare; era un buco nello hobbit, e questo significa conforto.

Esempio di output: 1 parola con un carattere raro

Ho iniziato il codice in cui spezzo il paragrafo dell'utente in un elenco, ma ho difficoltà a scorrere l'elenco e trovare ogni istanza delle lettere speciali.

Questo è quello che ho finora:

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

Se corro con l'input di esempio, ottengo un output di "0 parole con un carattere raro". Come ho potuto risolvere questo problema in modo da ottenere l'output previsto. Qualsiasi aiuto sarebbe molto apprezzato in quanto sono ancora relativamente nuovo alla programmazione

Anche una breve nota: mi è permesso solo usare i metodi / funzioni di split () e Len ()


.indexdovrebbe fare il lavoro
bigbounty

È necessario esaminare l'output e aggiungere alcune istruzioni di stampa per assicurarsi che siano soddisfatte le istruzioni e le condizioni.
Fallenreaper

errore di battitura. la riga sopra il ciclo interno non dovrebbe essere wds = astring.split ()
abhilb

Qual è lo scopo di for astring in words:?
norok2

Dai nomi delle variabili penso che tu sia confuso. Cambia "per l'astring in parole:" in "per word in words.split ():". Quindi "for char in wds:" to for char in word: ". E cancella" wds = words.split () ".
kantal,

Risposte:


4

Forse questa potrebbe essere un'opportunità per farti conoscere alcune funzionalità di 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"

Questa risposta utilizza:

  1. la digitazione , che può essere utilizzata da strumenti di terze parti come correttori di tipi, IDE, linters, ma soprattutto per chiarire le tue intenzioni ad altri umani che potrebbero leggere il tuo codice.
  2. argomenti predefiniti , invece di codificarli all'interno della funzione. È molto importante documentare le tue funzioni, in modo che un utente non sia sorpreso dal risultato (vedi Principio della minima sorpresa ). Esistono ovviamente altri modi per documentare il tuo codice (vedi docstring ) e altri modi per progettare quell'interfaccia (potrebbe essere una classe per esempio), ma questo è solo per dimostrare il punto.
  3. Elenca le comprensioni , che possono rendere il tuo codice più leggibile rendendolo più dichiarativo anziché imperativo . Può essere difficile determinare l'intenzione dietro algoritmi imperativi.
  4. interpolazione di stringhe , che nella mia esperienza è meno soggetta a errori che a concatenare.
  5. Ho usato la guida di stile pep8 per nominare le funzioni, che è la convenzione più comune nel mondo di Python.
  6. Infine, invece di stampare ho restituito a strnella cool_parafunzione perché il codice sotto il # DO NOT CHANGE CODE BELOWcommento sta stampando il risultato della chiamata di funzione.

1
Una delle migliori implementazioni che ho visto finora. Non potrebbe essere più Pythonic. :-) Vorrei solo cambiare titolo rare_chars()al find_rare_words()posto.
accdias,

1

Idealmente, vuoi usare la comprensione dell'elenco.

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

Questo ti dà:

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

Input: Ciao questa è una frase sugli zoo

Risultato: 1 parola / e con un carattere raro


0

Il seguente codice è una tua modifica che risulta nella risposta corretta di 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()

Risposta:

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

Questo codice funzionerà per te. Annulla l'iscrizione delle parole e osserva le parole stringa che ho usato per testare il codice.

Il metodo para non è necessario.

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 soluzione fornita da Barb funziona per una sola lettera:

CoolPara ( 'f')

Ma non funziona con i personaggi mulitple come richiesto dal poster originale. Ad esempio, questo non restituisce i risultati corretti:

CoolPara ( "jxqz")

Ecco una versione leggermente migliorata della soluzione di 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.