2016-05-07 13 views
3

私は、文字と周波数の辞書を含むリストを持っています。基本的には、アルファベット(小文字と大文字)とスペースごとにそれぞれ53の辞書があります。辞書のリストからキー値を取得する

adict = {'Letter':'a', 'Frequency':0} 
bdict = {'Letter':'b', 'Frequency':0} 
cdict = {'Letter':'c', 'Frequency':0} 

単語を入力すると、単語をスキャンして対応する文字の頻度を更新します。

for ex in range(0, len(temp)): 
    if temp[count] == 'a': adict['Frequency']+=1 
    elif temp[count] == 'b': bdict['Frequency']+=1 
    elif temp[count] == 'c': cdict['Frequency']+=1 

たとえば、「He​​llo」と入力します。文字「H、e、l、l、o」が検出され、その頻度が更新されます。ゼロ以外の周波数は新しいリストに転送されます。

if adict['Frequency'] != 0 : newArr.append(adict) 
if bdict['Frequency'] != 0 : newArr.append(bdict) 
if cdict['Frequency'] != 0 : newArr.append(cdict) 

この後、私はnewArrをFrequencyでソートし、finalArrという新しいリストに転送しました。以下は、 "Hello"という単語のサンプルリストの内容です。

{'Letter': 'H', 'Frequency': 1} 
{'Letter': 'e', 'Frequency': 1} 
{'Letter': 'o', 'Frequency': 1} 
{'Letter': 'l', 'Frequency': 2} 

ここで、キー値のみを2つの別々のリストに転送することをお勧めします。 letterArrとnumArrです。これはどうすればいいですか?私の希望する出力は:

letterArr = [H,e,o,l] 
numArr = [1,1,1,2] 
+3

です。彼らは決して関連していません。つまり、それらを反復する簡単な方法はありません。それぞれの辞書には2つの要素しか含まれていないのはなぜですか?なぜ文字をキーとして使用し、頻度を値として使うのか? – Neel

+1

なぜ最初に53の辞書がありますか? 'freq_dict = {'a':0、 'b':0、...}'のようにすることができます。その後、周波数をリストに簡単に転送できます。 – Selcuk

+0

私は理解しやすくするだけです。基本的に私の最後のリストは単なる辞書のリストです。 – Learner

答えて

3

なぜあなただ​​けcollections.Counterを使用していませんか?例:

​​

頻度を増やして並べ替えるには、sorted()を使用してください。 itemgetter()はソート順を逆にしてソートが最初に実行され、次にソートが実行されます。ソートされた周波数は、アンパックリストのzip()を使用して区切られます。

デモ

 
Enter a word: Hello 
('H', 'e', 'o', 'l') 
(1, 1, 1, 2) 

結果はタプルですが、あなたはlist(letter_arr)list(num_arr)にしたい場合は、リストに変換することができます。

+0

前にこれを考えなかった。あなた大変感謝しています!ちょうど私のコードを短くしました。まだPythonでたくさんのことを学ぶ必要があります。 – Learner

1

私はこの問題のためのあなたのデータ構造の選択肢を理解しています。

frequencies = { 'H': 1, 'e': 1, 'l': 2, 'o': 1 } 

カウンターを実装するのも簡単です:: は、なぜあなたはちょうどこのような辞書を行っていない

from collections import Counter 
frequencies = Counter("Hello") 
print(frequencies) 
>>> Counter({ 'H': 1, 'e': 1, 'l': 2, 'o': 1 }) 

はその後、別の単語を追加するには、単に必要があるだろうupdateメソッドを使用します。最後に

frequencies.update("How") 
print(frequencies) 
>>> Counter({'l': 2, 'H': 2, 'o': 2, 'w': 1, 'e': 1}) 

を、あなたの2つの配列を取得するには、あなたが行うことができます:

letterArr, numArr = zip(*frequencies.items()) 

あなたが本当にリストが必要な場合、これは、しかしあなたにタプルを与えるだけの操作を行います。list(letterArr)

0

zip、コレクション、itemgetterなどのようなトドゥーを使わなくても簡単な答えがほしいと思っていました。

finalArr= [{'Letter': 'H', 'Frequency': 1}, 
      {'Letter': 'e', 'Frequency': 1}, 
      {'Letter': 'o', 'Frequency': 1}, 
      {'Letter': 'l', 'Frequency': 2}] 

letterArr = [] 
numArr = [] 
for i in range(len(finalArr)): 
    letterArr.append(finalArr[i]['Letter']) 
    numArr.append(finalArr[i]['Frequency']) 
print letterArr 
print numArr 

出力は、3つの別々の辞書を持っている

['H', 'e', 'o', 'l'] 
[1, 1, 1, 2] 
関連する問題