2016-07-16 35 views
1

这看起来很基本(尽管我的确来自MySQL背景)。python等价的MySQL“左连接”两个元组列表

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?

(也许我不是寻找正确的术语...但我不(认为)我想附加或合并或CONCAT ......)

回答

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中模拟数据库操作(如过滤器,连接,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,where),pandas是一个更好的解决方案:) – linpingta

+0

哦,只需使用尽可能少的附加非标准模块...尝试尽可能让python尽可能靠近根源 - 主要是为了学习puposes。 – Trees4theForest