2016-07-16 5 views
1

これは基本的です(私はMySQLのバックグラウンドから来ていますが)。Pythonに相当するMySQLの "Left Join" 2組のタプルのリスト

a = [(1,f,e),(7,r,None),(2,s,f),(32,None,q)] 
b = [(32,dd), (1,pp)] 

私は、MySQL(LEFT JOIN)でこれを行う場合は、次の

SELECT a.*, b.* FROM a LEFT JOIN b ON a[0] = b[0] 

私が手:

[(1,f,e,1,pp),(7,r,None,None,None),(2,s,f,None,None),(32,None,q,32,dd)] 

はどのようにして、このpythonicallyを達成するのでしょうか?あなたは辞書を作ることによってそれを解決することができます

答えて

3

は(...私は追加したりマージしたり連結したい)たぶん私は右の用語を探していないよ...しかし、私は(ないと思います)第二の入力リストの外にし、それに見上げ:

>>> a = [(1,'f','e'),(7,'r',None),(2,'s','f'),(32,None,'q')] 
>>> b = [(32,'dd'), (1,'pp')] 
>>> 
>>> b_dict = {item[0]: item for item in b} 
>>> [item + b_dict.get(item[0], (None, None)) for item in a] 
[ 
    (32, None, 'q', 32, 'dd'), 
    (1, 'f', 'e', 1, 'pp'), 
    (2, 's', 'f', None, None), 
    (7, 'r', None, None, None) 
] 

我々は結果のリストを形成するためにaを反復処理、及び第二のリストの値を見ているので、これは「LEFT JOINの」として作用します - 右の "テーブル"に存在しない場合でも、左の "テーブル"からすべてのアイテムを返す。

1

解決策としてpandasを選択できます。 pandasはデータプロセスに関連するPythonモジュールで、MySQLインターフェイスを持ち、DataFrameにデータベース操作(filter、join、groupbyなど)を模擬することができます。詳しくはhereをチェックしてください。以下のように

import pandas as pd 

# origin data 
#a = [(1,f,e),(7,r,None),(2,s,f),(32,None,q)] 
#b = [(32,dd), (1,pp)] 

# new data 
a = [{'a1':1,'a2':'f', 'a3':'e'}, {'a1':2, 'a2':'r', 'a3':None}] 
b = [{'b1':32, 'b2':'dd'}, {'b1':1, 'b2':'pp'}] 

pd_a = pd.DataFrame(a) 
pd_b = pd.DataFrame(b) 

result = pd.merge(pd_a, pd_b, left_on='a1', right_on='b1', how='left') 
print result 

出力:

a1 a2 a3 b1 b2 
0 1 f  e 1 pp 
1 2 r None NaN NaN 
+0

私はそれを見ていた - しかし、可能な限り「コア」の方法を見つけることを期待して... – Trees4theForest

+0

こんにちは@ Trees4theForestは、あなたが何を意味するかについて"コア"の方法?私の意見では、pythonスクリプトの中でマルチデータベース型操作(join、groupby、sumなど)をしたい場合、pandasはより良い解決策です:) – linpingta

+0

ああ、できるだけ少数の追加の非標準モジュールを使用しています...試してみてくださいPythonをできるだけ根元に近づけるように - 主に習得するためのものです。 – Trees4theForest