2016-10-30 10 views
-2

次の問題があります。私のコードでは、私は、ある時点で、次の例のように見えるんリストを取得しています:リスト内の特定の文字の数

['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100',...., '10100010'] 

今、私は0、1、2、3、...のバーで文字列発生した頻度を知りたいです。 簡単な方法はありますか?

編集:私は['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100',...., '10100010'].count(-)のようなものが動作するはずと思ったが、それはしないの

EDIT2:また、動作しているようです私の2回目の試行は、次のとおりです。

barcounter = numpy.zeros(8) 
for x in range(len(list)): 
    rankcounter[8-1-list[x].count("-")] += 1 
print("barcounter", barcounter) 
+4

はい:

結果はこのようになります。これまでに何を試しましたか?あなたの試みを見せてもらえますか? – idjaw

+2

リストには 'count'メソッドがありません。文字列は行います。あなたのリストの項目を繰り返し、そこに 'count'を適用します。それは簡単です。また、あなたはバーを引用する必要があります。 –

+0

ああ大丈夫、私はそれが助けると思います:) – HighwayJohn

答えて

1

私はあなたが行っていた何の感覚を得ますforしかし、リストをループする必要があります。ここでは多くのバーが文字列中に現れたバーの数からの周波数に対応付ける辞書を返しソリューションです:

from collections import defaultdict 

def get_bar_freq(bar_list): 
    bar_freq = defaultdict(int)  # a dictionary that will keep track of frequencies 
    for word in bar_list: 
     num_bars = word.count('-') 
     bar_freq[num_bars] += 1  # increment freq of this many num_bars 
    return bar_freq 


def main(): 
    bar_list = ['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100', '10100010'] 
    print(get_bar_freq(bar_list)) 

if __name__ == '__main__': 
    main() 

この出力は:defaultdict(<class 'int'>, {0: 1, 2: 1, 3: 2, 4: 2}) 1つの文字列は2が含まれて、1つの文字列が0のバーが含まれて言っている。すなわち2本の弦は3本の棒を含み、2本の弦は4本の棒を含んでいた。

ここで何が起こっているのか理解した後、もっとPythonic(そしてもっと良い)方法を見たい場合は、他の答えをチェックしてください。本ソリューションでbar_freq辞書の機能を提供するcollections.counterを使用することができます。

+0

ああ、ありがとう、それはまた本当に素晴らしい解決策です! – HighwayJohn

+1

これにはカウンターが適しており、1つのライナーになります。例えば ​​'Counter(w_bar_listのwのためのw.count(" - "))' – Copperfield

+0

@Copperfield私は全面的に同意します。しかし、私は教育学的に何が起こっているのかを人々が見ているほうが良いことを知っています。私は誰かのために働く契約コードの猿のコードを書いているわけではありません。私は彼らが学ぶのを助けるためにここにいます、そして、ライナーの1人はいつもそれをする方法ではありません。それにもかかわらず、最後に1つのライナーを参照として追加します。ありがとう(y) – gowrath

2

あなたが実際にcollections.Counterを使用することができます2.7以降は、Pythonを使用している場合:

from collections import Counter 

def get_bar_freq(bar_list): 
    return Counter(entry.count('-') for entry in bar_list) 

を我々の場合には値が反復可能に表示されますどのくらいの頻度Counterカウント。適切なイテレータを取得するには、何をカウントしたいのかのリストを取得するだけです。この場合、文字列に含まれる「棒」の数。

Counter({3: 2, 4: 2, 0: 1, 2: 1}) 
+0

ああ大丈夫、これは私が探していたものです。ありがとう:)私の簡単な試しよりもずっと短いです。 – HighwayJohn

関連する問題