3

基本的に入力文字列を持つプログラムを作成しようとしています。プログラムが行うことになっているのは、最も多く発生する文字を出力し、それが何回発生するかを示すことです。また、出現回数が最も少ない文字を出力し、それが何回出現したかを示します。

私はサマーカレッジコースの一部でこれを行っているので、これを始めるのに苦労しています.6週間で全学期のクラスなので、クラスはかなり早く過ぎていきます. 私が始めることができるように、誰かが私のためにこれの背後にあるロジックを説明してもらえますか?

私たちは多くの異なる方法を学んでいないので、基本的な python プログラミングに固執していただければ幸いです。<- while ループや for ループのように、リスト、タプル、文字列などを学びました。他には何も学びませんでした..

ありがとう

4

4 に答える 4

7
from collections import Counter
the_string = "This is a string!"
Counter(x for x in the_string if not x.isspace()).most_common()

Counters/dicts/etc なしで開始する方法を次に示します。

>>> the_string = "This is a string!"
>>> A = [0] * 256
>>> for x in the_string:
...     if not x.isspace():
...         A[ord(x)] += 1
... 

ord()各文字を位置にマッピングしますA

>>> A
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 3, 0, 0, 0, 0, 1, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

このような最も一般的な文字の1 つを簡単に見つけることができます

>>> chr(A.index(max(A)))
'i'

そうでない最小値が必要なので、最小値はより複雑です。0

>>> chr(A.index(min(x for x in A if x)))
'!'

わかりました。おそらく、max 式と min 式、および generator 式に慣れていないでしょうが、for6 週間後にはループを使用してそれを実行できるようになるはずです。

于 2013-07-01T03:41:52.300 に答える
4

私は挑戦が好きです。複雑なデータ構造はなく、単純なループと if のみです。これが複雑すぎる場合は、教師が悪いことをしたことになります。

w = "This is the song that doesn't end; yes it goes on and on my friend."
max_letter = w[0]
min_letter = w[0]
max = w.count(w[0])
min = w.count(w[0])
for c in w:
    if c is not " ":
        if w.count(c) > max:
            max_letter = c
            max = w.count(c)
        if w.count(c) < min:
            min_letter = c
            min = w.count(c)

print max, max_letter
print min, min_letter

>>> 7 n
>>> 1 T

@Rohan は、これをどのように構築したかを尋ねました。基本的には、質問に答えたり、新しい質問を作ったりする練習です。

出現する最大および最小の文字は何ですか? 最初に知っていることは、いくつかのものを見つけて印刷する必要があるということです。それらは最小文字と最大文字です。すべての始まりで、最初の文字が両方になることがわかっているので、そこから始めましょう。ただし、文字列が空の場合はどうなるでしょうか?

max_letter = w[0]
min_letter = w[0]

これらの文字が最も多い場合と最も少ない場合、どのくらいの頻度で出現しますか? これで、追加情報を追跡する必要があることがわかりました。最初の文字が最小値と最大値であると判断したので、この文字の数を and に設定しminますmax

max = w.count(w[0])
min = w.count(w[0])

これらの文字が実際に最も一般的で最も一般的でないことをどのように知ることができますか? さて、すべての文字をチェックする必要があります。これをループで実行できます。

for c in w:

この現在のキャラクターは私がチェックしているものですか?この場合、スペースではないものだけが必要ですが、ここで何でもチェックできます。

    if c is not " ":

この現在の手紙は最も一般的ですか?わからないので、最大数と照合して確認し、最大数の文字と最大数を更新してください。

        if w.count(c) > max:
            max_letter = c
            max = w.count(c)

最も一般的でないものについても同じ...

        if w.count(c) < min:
            min_letter = c
            min = w.count(c)

次に、私が見つけたものを印刷します

print max, max_letter
print min, min_letter

このアルゴリズムは改善できますか? はい。'n'このアルゴリズムは、文字が最大 7 回あるかどうかをチェックしました。答えは決して変わりません。また、文字列を何度も通過します-

  • for ループで文字ごとに 1 回
  • 単純なカウント アルゴリズムでは、反復ごとに再度実行してカウントを取得します。
于 2013-07-01T04:06:51.910 に答える
4

使用できますcollections.Counter

>>> Counter(''.join("This is a string!".split())).most_common()
[('i', 3), ('s', 3), ('a', 1), ('!', 1), ('g', 1), ('h', 1), ('n', 1), ('r', 1), ('T', 1), ('t', 1)]

または、学習目的で、for ループと辞書を使用してカウントを保持することもできます。

mystring = ''.join("This is a string!".split())
mydict = {}
for char in mystring:
    if char not in mydict:
        mydict[char] = 1
    else:
        mydict[char] += 1

print mydict
# {'a': 1, '!': 1, 'g': 1, 'i': 3, 'h': 1, 'n': 1, 's': 3, 'r': 1, 'T': 1, 't': 1}
print max(mydict.items(), key=lambda x: x[1])[0]
# i

max()オブジェクトから最大値を取得します。ディクショナリを使用しているため、キー引数を渡します。

mydict.items()キーと値を 1 つのタプルにまとめたタプルのリストを返します。

key=lambda x: x[1]タプルの 2 番目の項目を調べるように Python に指示しています。最後に[0]、キーを取得するために使用されます。

mydict.items次のようになります。

[('a', 1), ('!', 1), ('g', 1), ('i', 3), ('h', 1), ('n', 1), ( 's', 3), ('r', 1), ('T', 1), ('t', 1)]

辞書の解凍版のようなものです。


最も一般的でない場合は、単純にmin():) を使用します。パイソンは楽しくないですか?

于 2013-07-01T03:33:12.323 に答える
1

これは、辞書とキーを取得するためのいくつかの方法を使用して簡単に解決できます。辞書は一意のキーを持つことが保証されていますが、その順序は保証されていません。

d = dict()
w = "This is the song that doesn't end; yes it goes on and on my friend."
for letter in w:
    if d.get(letter) is not None:
        d[letter] += 1
    else:
        d[letter] = 1

要素の数を取得することが最大のハードルだったので、残りはあなたに解決してもらいたいと思います。これも比較的簡単に最大値と最小値を取得できます。

于 2013-07-01T03:38:02.317 に答える