Localizando caracteres específicos em uma lista

11

O objetivo é fazer uma lista do parágrafo do usuário e iterar para que eu possa contar quantas palavras contêm letras especiais "j, x, q, z".

Exemplo de entrada:
Em um buraco no chão, vivia um hobbit. Nem um buraco nojento, sujo e úmido, cheio de pontas de vermes e um cheiro escorrendo, nem um buraco seco, nu e arenoso, sem nada para sentar ou comer; era um buraco de hobbit, e isso significa conforto.

Exemplo de saída: 1 palavra com um caractere raro

Comecei o código em que dividi o parágrafo do usuário em uma lista, mas estou tendo dificuldade para percorrer a lista e encontrar cada instância das letras especiais.

Isto é o que eu tenho até agora:

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 eu executar com a entrada de exemplo, recebo uma saída de '0 palavra (s) com um caractere raro'. Como eu poderia corrigir isso para que eu possa obter a saída esperada. Qualquer ajuda seria muito apreciada, pois ainda sou relativamente novo em codificação

Também uma observação rápida: só posso usar os métodos / funções de split () e Len ()

yariee
fonte
.indexdeve fazer o trabalho
bigbounty
Você deve percorrer a saída e adicionar algumas instruções de impressão para garantir que as instruções e condicionais sejam atendidas.
Fallenreaper 29/10/19
erro de digitação. a linha acima circuito interno não deverá ser WDS = astring.split ()
abhilb
Qual é o propósito for astring in words:?
Norok2 29/10/19
Dos nomes das variáveis, acho que você está confuso. Altere "para adstringir em palavras:" para "para adstringir em palavras.split ():". Em seguida, "for char in wds:" to for char in word: ". E exclua" wds = words.split () ".
kantal 29/10/19

Respostas:

4

Talvez essa seja uma oportunidade para apresentar alguns recursos do 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 resposta usa:

  1. digitação , que pode ser usada por ferramentas de terceiros, como verificadores de tipos, IDEs, linters, mas o mais importante é deixar suas intenções claras para outras pessoas que possam estar lendo seu código.
  2. argumentos padrão , em vez de codificá-los dentro da função. É muito importante documentar suas funções, para que um usuário não se surpreenda com o resultado (consulte Princípio de menor espanto ). É claro que existem outras maneiras de documentar seu código (consulte a documentação ) e outras maneiras de criar essa interface (pode ser uma classe por exemplo), mas isso é apenas para demonstrar o ponto.
  3. Compreensões de lista , que podem tornar seu código mais legível, tornando-o mais declarativo em vez de imperativo . Pode ser difícil determinar a intenção por trás de algoritmos imperativos.
  4. interpolação de string , que na minha experiência é menos propensa a erros do que concatenar.
  5. Usei o guia de estilo pep8 para nomear as funções, que é a convenção mais comum no mundo python.
  6. Finalmente, em vez de imprimir, retornei um strna cool_parafunção porque o código abaixo do # DO NOT CHANGE CODE BELOWcomentário está imprimindo o resultado da chamada de função.
Marcus Vinícius Monteiro
fonte
11
Uma das melhores implementações que já vi até agora. Não poderia ser mais pitonico. :-) gostaria apenas de mudar o nome rare_chars()para find_rare_words()seu lugar.
accdias 29/10/19
1

Idealmente, você deseja usar a compreensão da 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

Isso lhe 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
Barb
fonte
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: Olá, esta é uma frase sobre zoológicos

Saída: 1 palavra (s) com um caractere raro

KILLtheWEEZEL
fonte
0

O código a seguir é uma edição sua que resulta na resposta adequada 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()

Responda:

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
fonte
0

Este código funcionará para você. Desmarque a entrada de palavras e observe a declaração de sequência de palavras que eu usei para testar o código.

O método para não é necessário.

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
fonte
0

A solução fornecida por Barb funciona com uma única letra:

CoolPara ('f')

Mas ele não funciona com vários caracteres, conforme solicitado pelo pôster original. Por exemplo, isso não retorna os resultados corretos:

CoolPara ("jxqz")

Aqui está uma versão ligeiramente melhorada da solução 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
fonte