2017-03-01 17 views
0

私は非常にPythonに新しいです。この質問は非常に簡単かもしれません。 私は以下の2つのリストを持っています。Python辞書forとifループ

Mobile= ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2') 
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall') 

モバイルで各テスト項目が何回実行されたかをカウントするループを作成します。たとえば、私は 'M1'に4つの '呼び出し'シナリオ、2つの 'SMS'、1つの 'mms'があることをコードに伝えたいと思います。 私は辞書でこれを行うことができると思ったので、辞書でキーとして使用するtot変数を作成し、辞書を作成しましたが(以下のように)、forとif文を使って私が望むことをする方法はわかりません。私が下に書いたコードは正しい答えを与えていません。それはちょうどゼロを返します。

Mobile= ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2') 
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall') 
tot=(1,2,3,4,5,6,7,8,9,10,11,12,13,14) 

a_dict=dict(zip(tot,zip(Mobile,Test))) 

for k, v in a_dict.iteritems(): 
    if (k==Mobile[1] and v==Test[1]): 
     countM1Test1+=1 
+0

まず、なぜあなたはその変数を必要としていますか?、それは便利で必要なのでしょうか?第2に、モバイルリストを辞書のキーとして使用し、テスト変数の対応関係を評価し、その情報を使用してカウントを実行することができます –

+0

表示したい結果の例を教えてください。 – JavoSN

+0

私はzip(Mobile、Test)を試してみましたが、作成された辞書には2つの項目( 'M1'、 'call')と( 'M2'、 'voltecall')しかありませんでした。多分辞書にユニークなキー変数が必要だと思ったので、私はtot変数を作りました。私が見たいのは、このようなものです。 ( 'M1'、 'call'、4)、( 'M1'、 'sms'、2)、( 'M1'、 'mms'、1)などです。 – sara

答えて

2

次のようにして、Counterdefaultdictを使用することができます。

from collections import defaultdict, Counter 
​ 
count = defaultdict(Counter) 
for m, t in zip(Mobile, Test): 
    count[m].update({t: 1}) 

count 
# defaultdict(collections.Counter, 
#    {'M1': Counter({'call': 4, 'mms': 1, 'sms': 2}), 
#    'M2': Counter({'mms': 2, 'sms': 2, 'voltecall': 3})}) 

あなたはタプルのリストが必要な場合、あなたは簡単にリストの内包と上記辞書countからタプルを抽出することができます。

[(k, a, c) for k, v in count.items() for a, c in v.items()] 

# [('M1', 'mms', 1), 
# ('M1', 'sms', 2), 
# ('M1', 'call', 4), 
# ('M2', 'mms', 2), 
# ('M2', 'sms', 2), 
# ('M2', 'voltecall', 3)] 

更新

あなたは3つのリストを持っている場合は、ネストされたdefaultdict作ることができます。

Mobile= ('M1','M1','M1','M1','M1','M1','M1','M2','M2','M2','M2','M2','M2','M2') 
Test=('call','call','sms','sms','mms','call','call','mms','mms','sms','sms','voltecall','voltecall','voltecall') 
Response = ('error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success', 'skip', 'error', 'success') 

from collections import defaultdict, Counter 

count = defaultdict(lambda : defaultdict(Counter)) 
for m, t, r in zip(Mobile, Test, Response): 
    count[m][t].update({r: 1}) 

:あなたはもっと持っている場合は、私はあなたが見てみましょう示唆をpandasライブラリを使用すると、このタイプのグループ化された操作がより簡単になります。

+0

ありがとうございました。カウントを1つずつ印字することは可能ですか?私がカウントのタイプを見つけようとしたとき、私は応答collections.defaultdictを得ます。私はカウント[1]を印刷しようとしましたが、エラーメッセージが表示されます。 – sara

+0

'count'は要素にアクセスするための辞書で、' count ['M1'] 'や' count ['M2'] 'などのキーを指定する必要があります。 – Psidom

+0

フォローアップの質問です。辞書に組み合わせるリストが2つ以上あるとどうなりますか?たとえば、テストで「成功」、「エラー」、「スキップ」のいずれの項目を示すリストがもう1つあります。新しい辞書を作成して、3つのリストで指定したとおりにカウントするにはどうすればよいですか? – sara

0
from collections import Counter 
pairs = zip(*(Mobile, Test)) 
c = Counter(pairs) 
print c.items() 

出力:

[(( 'M1'、 'SMS')、2)、(( 'M2'、 'voltecall')、3)、(( 'M1'、「コール2)、2)、(( 'M1'、 'mms')、1)]