Znajdowanie określonych znaków na liście

11

Celem jest utworzenie listy z akapitu użytkownika i iteracji, dzięki czemu będę mógł policzyć, ile słów zawiera specjalne litery „j, x, q, z”.

Przykładowe dane wejściowe:
W dziurze w ziemi mieszkał hobbit. Ani paskudna, brudna, mokra dziura, wypełniona końcami robaków i oleistym zapachem, ani sucha, naga, piaszczysta dziura, w której nie ma nic do siedzenia lub jedzenia; to była dziura hobbita, a to oznacza komfort.

Przykładowy wynik: 1 słowo z rzadkim znakiem

Zacząłem kod, w którym dzielę akapit użytkownika na listę, ale mam trudności z iteracją po liście i znajdowaniem każdego wystąpienia specjalnych liter.

Oto co mam do tej pory:

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

Jeśli uruchomię z przykładowym wejściem, otrzymam wynik „0 słów z rzadkim znakiem”. Jak mogłem to naprawić, aby uzyskać oczekiwany wynik. Każda pomoc byłaby bardzo mile widziana, ponieważ wciąż jestem stosunkowo nowy w programowaniu

Również krótka uwaga: wolno mi używać tylko metod / funkcji split () i Len ()

Yariee
źródło
.indexpowinien wykonać zadanie
bigbounty,
Powinieneś przejrzeć dane wyjściowe i dodać kilka instrukcji drukowania, aby upewnić się, że instrukcje i warunki są spełnione.
Fallenreaper,
literówka. nie powinien być linią powyżej wewnętrznej pętli wds = astring.split ()
abhilb 29.10.19
Jaki jest cel for astring in words:?
norok2
Z nazw zmiennych myślę, że jesteś zdezorientowany. Zmień „na ciąg znaków w słowach:” na „dla słowa w słowach. Split ():”. Następnie „for char in wds:” to for char in word: ”. I usuń„ wds = words.split () ”.
kantal

Odpowiedzi:

4

Może to być okazja do zapoznania się z niektórymi funkcjami Pythona:

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"

Ta odpowiedź wykorzystuje:

  1. pisanie , które może być używane przez narzędzia innych firm, takie jak sprawdzanie typów, IDE, lintery, ale co ważniejsze, aby wyjaśnić twoje intencje innym ludziom, którzy mogą czytać Twój kod.
  2. domyślne argumenty zamiast zakodować je na stałe w funkcji. Bardzo ważne jest udokumentowanie swoich funkcji, aby wynik nie był zaskoczony (patrz Zasada najmniejszego zdziwienia ). Istnieją oczywiście inne sposoby dokumentowania kodu (patrz docstrings ) i innych sposobów projektowania tego interfejsu (może być klasa na przykład), ale to tylko w celu wykazania punkt.
  3. Wymień wyrażenia , które mogą uczynić twój kod bardziej czytelnym, czyniąc go bardziej deklaratywnym niż imperatywnym . Określenie intencji algorytmów imperatywnych może być trudne.
  4. interpolacja ciągów , która z mojego doświadczenia jest mniej podatna na błędy niż konkatenacja.
  5. Użyłem pep8 przewodnik stylu do nazwy funkcji, która jest najczęstszą konwencja w świecie Pythona.
  6. Wreszcie, zamiast drukować I zwracana jest strw cool_parafunkcję, ponieważ kod poniżej # DO NOT CHANGE CODE BELOWkomentarzu drukuje wynik wywołania funkcji.
Marcus Vinícius Monteiro
źródło
1
Jedna z najlepszych implementacji, jakie do tej pory widziałem. Nie może być bardziej Python. :-) Zamiast tego zmieniłbym nazwę rare_chars()na find_rare_words().
accdias
1

Idealnie chcesz używać rozumienia listy.

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

To daje ci:

['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
Kolec
źródło
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: ")))

Wejście: Witam, to zdanie o ogrodach zoologicznych

Wyjście: 1 słowo (słowa) z rzadkim znakiem

KILLtheWEEZEL
źródło
0

Poniższy kod jest Twoją edycją, która daje poprawną odpowiedź 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()

Odpowiedź:

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
źródło
0

Ten kod będzie dla ciebie działał. Usuń zaznaczenie wprowadzonych słów i zaznacz instrukcję ciągu słów, której użyłem do przetestowania kodu.

Metoda para nie jest potrzebna.

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
źródło
0

Rozwiązanie dostarczone przez Barb działa na pojedynczą literę:

CoolPara („f”)

Ale nie działa z wieloma postaciami, o które pytał oryginalny plakat. Na przykład nie zwraca to poprawnych wyników:

CoolPara („jxqz”)

Oto nieco ulepszona wersja rozwiązania 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
źródło