2012-01-28 4 views
2

のマージ、私は二つのリストPythonの:二つのリスト

list1= [6, 1, 8, 1, 2] 
    list2= ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

を持っている私は、私は彼らにDictのを変換しようとしたが、それは重複する値を許可していませんまず

(14,"mailopened") (4,"mailnotopened") 

ようにしようとした結果でした。 これは2番目のリストに従ってこれらのリストを追加することができます。

+0

(上記参照)同じ溶液で速かった、リストは角括弧 '[] 'によって示されています。かっこは通常タプルとともに使用されます。 – voithos

+0

私の謝罪、私は私の質問を修正しました。 – shobhit

答えて

7

defaultdictを使用して、単にlist1の値を追加します。

from collections import defaultdict 

list1 = [6, 1, 8, 1, 2] 
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

added = defaultdict(int) 

for i, k in enumerate(list2): 
    added[k] += list1[i] 

defaultdictが存在しないキーがアクセスされた場合は、デフォルト値を提供するので、これは動作します。この場合、0というデフォルト値を指定します。これは、intタイプであるためです。

@ギャレットジャックスからenumerate()の盗難の使用。 :)

+0

あなたは私を持っています...あまりにも遅い:) – GaretJax

+1

ありがとうトン...それは完全に働いた – shobhit

4
dict_out = dict() 
for list1_val, k in zip(list1, list2): 
    dict_out[k] = dict_out.get(k, 0) + list1_val 

出力:

In [10]: dict_out 
Out[10]: {'not open': 4, 'open': 14} 

説明:

  1. zip(list1, list2)がシーケンス(6, 'open'), (1, 'not open'), ..., (2, 'not open')と同等です。辞書dict_outについて

  2. dict_out.get(k, 0)戻り dict_out[k]それが存在する場合、そうでない場合 0

  3. したがって、forループは、5つの(値、キー)ペアを繰り返し反復し、辞書dict_outに累積します。

+1

これは私が以前見たことのない 'dict.get()'の使い方です。ありがとう! – voithos

+0

私はそれを試しましたが、いつも私に与えていますAttributeError: '長い'オブジェクトには属性 'get'がありません – shobhit

+0

申し訳ありません。 'dict_out [k] = ...'でなければなりません。編集を参照してください。 –

2
from collections import defaultdict 

list1 = [6, 1, 8, 1, 2] 
list2 = ["Mail Opened", "Mail Not Opened", "Mail Opened", "Mail Not Opened", "Mail Not Opened"] 

d = defaultdict(lambda:0) 

for i, k in enumerate(list2): 
    d[k]+=list1[i] 

print d 
print d.items() 

編集:voitosは、Pythonで

+0

Hehe、素敵な。私は 'int'を指定する代わりに' lambda'を使用していることに気付きました。おそらく 'int'は少し上手くいくでしょうか?そして再び、 'enumerate()'はおそらく 'zip()'より速いでしょう。 – voithos

+0

enumerateは確かにより多くのメモリを効率的にしています... ;-) intを使用するとは思わなかった...次回は覚えています! – GaretJax

+0

Btw @voithos、あなたの答えを編集して、 'enumerate'を使ってください。同様の問題を持つ次のものが 'zip'を使用する理由はありません;-) – GaretJax

関連する問題