リスト内の特定の文字を見つける


11

目的は、ユーザーの段落からリストを作成し、反復して、「j、x、q、z」という特殊文字を含む単語の数を数えることです。

入力例:
地面の穴にホビットが住んでいた。ワームの先端とにじみ出るにおいで満たされた、汚くて湿った汚い穴ではなく、座ったり食べたりするための何もない乾燥した裸の砂の穴ではありません。それはホビットホールでした、そしてそれは快適さを意味します。

出力例: 珍しい文字を含む1つの単語

ユーザーの段落をリストに分割するコードを開始しましたが、リストを繰り返し処理して特殊文字の各インスタンスを見つけるのに苦労しています。

これは私がこれまでに持っているものです:

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

入力例を使用して実行すると、「珍しい文字を含む0ワード」の出力が得られます。これをどのように修正すれば、期待される出力を得ることができますか?私はまだコーディングに比較的慣れていないので、どんな助けでも大歓迎です

また、簡単なメモ:split()およびLen()のメソッド/関数のみを使用できます


.index仕事すればいい
bigbounty

出力をウォークスルーし、いくつかの印刷ステートメントを追加して、ステートメントと条件が満たされていることを確認する必要があります。
Fallenreaper

打ち間違え。内側のループの上の行はwds = astring.split()
abhilb

の目的はfor astring in words:何ですか?
norok2

変数名から混乱していると思います。「for astring in words:」を「for word in words.split():」に変更します。次に、「for char in wds:」から「for char in word:」へ、そして「wds = words.split()」を削除
kantal

回答:


4

多分これはあなたにいくつかの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"

この回答は以下を使用します:

  1. タイプ、タイプチェッカー、IDE、リンターなどのサードパーティツールで使用できますが、より重要なのは、コードを読んでいる可能性のある他の人間に意図を明確にすることです。
  2. 関数内でハードコーディングする代わりに、デフォルト引数。ユーザーが結果に驚かないように、関数を文書化することは非常に重要です(最小驚きの原則を参照 )。もちろん、コードを文書化する他の方法(docstringsを参照)とそのインターフェースを設計する他の方法(たとえば、クラスにすることもできます)がありますが、これは要点を示すためだけのものです。
  3. 内包表記を一覧表示すると、命令型ではなく宣言型にすることでコードが読みやすくなります。命令型アルゴリズムの背後にある意図を判断するのは難しい場合があります。
  4. 文字列補間、私の経験では、連結よりもエラーが発生しにくいです。
  5. 関数の名前には、pep8スタイルガイドを使用しました。これは、Pythonの世界で最も一般的な規則です。
  6. 最後に、コメントの下のコードが関数呼び出しの結果を出力strしてcool_paraいるため、出力する代わりに、関数にaを返しました# DO NOT CHANGE CODE BELOW

1
これまで見た中で最高の実装の1つ。もっとPythonicになることはできませんでした。:-) 代わりに名前rare_chars()を変更しfind_rare_words()ます。
accdias

1

理想的には、リスト内包表記を使用する必要があります。

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

これはあなたに与えます:

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

入力:こんにちはこれは動物園についての文章です

出力:珍しい文字を含む1単語


0

次のコードはあなたの編集であり、適切な答えになります 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()

回答:

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

このコードはあなたのために働くでしょう。入力の単語のマークを外し、コードのテストに使用した単語の文字列ステートメントをコメントにします。

paraメソッドは必要ありません。

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

Barbが提供するソリューションは、1文字で機能します。

CoolPara( 'f')

ただし、元のポスターで要求されているように、複数のキャラクターでは機能しません。たとえば、これは正しい結果を返しません:

CoolPara( "jxqz")

以下は、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))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.