2016-09-23 6 views
1

私はこれらの2つのdictonariesを持っています。ここではキーが年(整数)で、値はfloatです。私はこれらの2つを結合し、その結果、年、値1、値2のタプルのリストを作成したいと考えています。したがって、このように:Pythonでタプルのリストを作成するためにdictonaryをスプライス

Dictonary 1

{2011: 1.0, 
2012: 2.0, 
2013: 3.0} 

Dictonary 2

{2011: 4.0, 
2012: 5.0, 
2013: 6.0} 

れる好ましい結果:

[(2011, 1.0, 4.0), 
(2012, 2.0, 5.0), 
(2013, 3.0, 6.0)] 

これを行う簡単な方法はありますか?お手伝いありがとうございます!

答えて

2

は両方の辞書が同じキーがある場合:

[(k, dict1[k], dict2[k]) for k in dict1.keys()] 

例:

In[33]: dict1 = {2011: 1.0, 
2012: 2.0, 
2013: 3.0} 
In[34]: dict2 = {2011: 4.0, 
2012: 5.0, 
2013: 6.0} 
In[35]: [(k, dict1[k], dict2[k]) for k in dict1.keys()] 
Out[35]: [(2011, 1.0, 4.0), (2012, 2.0, 5.0), (2013, 3.0, 6.0)] 
+1

'の面でパフォーマンスとf2の観点から、ここでの勝者です。 '.keys'の必要はありません –

4

をここでは、いくつかの可能な解決策です:

import timeit 
import random 

random.seed(1) 


def f1(d1, d2): 
    return [(k, d1[k], d2[k]) for k in list(set(d1.keys() + d1.keys()))] 


def f2(d1, d2): 
    return [(k, d1[k], d2[k]) for k in d1.viewkeys() & d2] 


def f3(d1, d2): 
    return [(k, d1[k], d2[k]) for k in set().union(d1, d2)] 

if __name__ == "__main__": 
    d1_small = {2011: 1.0, 
       2012: 2.0, 
       2013: 3.0} 

    d2_small = {2011: 4.0, 
       2012: 5.0, 
       2013: 6.0} 

    K, I, N = 1000, 100000, 100 
    d1_large = {i: random.randint(0, K) for i in range(I)} 
    d2_large = {i: random.randint(0, K) for i in range(I)} 

    # Small dataset 
    print timeit.timeit('f1(d1_small,d2_small)', setup='from __main__ import f1, d1_small,d2_small', number=N) 
    print timeit.timeit('f2(d1_small,d2_small)', setup='from __main__ import f2, d1_small,d2_small', number=N) 
    print timeit.timeit('f3(d1_small,d2_small)', setup='from __main__ import f3, d1_small,d2_small', number=N) 

    # Big dataset 
    print timeit.timeit('f1(d1_large,d2_large)', setup='from __main__ import f1, d1_large,d2_large', number=N) 
    print timeit.timeit('f2(d1_large,d2_large)', setup='from __main__ import f2, d1_large,d2_large', number=N) 
    print timeit.timeit('f3(d1_large,d2_large)', setup='from __main__ import f3, d1_large,d2_large', number=N) 

結果は以下のとおりです。

0.000144082492556 
0.000120792445814 
9.31601869678e-05 
2.70233741278 
2.74489385463 
2.5809042933 

結論:

F3キーを超えるdict1`繰り返し処理におけるkの冗長

+0

' list(set(d1.keys()+ d1.keys())) 'は非常に冗長な' d1.viewkeys()&d2'を書いています... –

+0

@JonClements Haha 、thx、それを知らなかった、編集!その「非常に冗長な方法」は少し誇張ですが、そうは思わないでしょうか?つまり、スニペットは3文字短くなります;-) – BPL

+0

よく、2つのリストを連結してセットに変換し、その結果をリストに変換します。実際の理由がない場合は追加作業がたくさんあります。 –

関連する問題