Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中SQL风格的内部联接?_Python - Fatal编程技术网

Python中SQL风格的内部联接?

Python中SQL风格的内部联接?,python,Python,我有两个这样的数组: [('a', 'beta'), ('b', 'alpha'), ('c', 'beta'), .. ] [('b', 37), ('c', 22), ('j', 93), .. ] ar1 = [('a', 'beta'), ('b', 'alpha'), ('c', 'beta')] ar2 = [('b', 37), ('c', 22), ('j', 93)] final_ar = [tuple(list(i)+[j[1]]) for i in ar1 for j

我有两个这样的数组:

[('a', 'beta'), ('b', 'alpha'), ('c', 'beta'), .. ]

[('b', 37), ('c', 22), ('j', 93), .. ] 
ar1 = [('a', 'beta'), ('b', 'alpha'), ('c', 'beta')]
ar2 = [('b', 37), ('c', 22), ('j', 93)]
final_ar = [tuple(list(i)+[j[1]]) for i in ar1 for j in ar2 if i[0]==j[0]]
print(final_ar)
我想制作一些类似于:

[('b', 'alpha', 37), ('c', 'beta', 22), .. ]

有没有一种简单的方法可以做到这一点?

没有内置的方法。我想,添加像
numpy
这样的包将提供额外的功能

但是,如果您想在不使用任何额外软件包的情况下解决此问题,可以使用如下单行程序:

[('a', 'beta'), ('b', 'alpha'), ('c', 'beta'), .. ]

[('b', 37), ('c', 22), ('j', 93), .. ] 
ar1 = [('a', 'beta'), ('b', 'alpha'), ('c', 'beta')]
ar2 = [('b', 37), ('c', 22), ('j', 93)]
final_ar = [tuple(list(i)+[j[1]]) for i in ar1 for j in ar2 if i[0]==j[0]]
print(final_ar)
输出:

[('b', 'alpha', 37), ('c', 'beta', 22)]

我建议使用散列鉴别器连接方式:

l = [('a', 'beta'), ('b', 'alpha'), ('c', 'beta')]
r = [('b', 37), ('c', 22), ('j', 93)]
d = {}
for t in l:
    d.setdefault(t[0], ([],[]))[0].append(t[1:])
for t in r:
    d.setdefault(t[0], ([],[]))[1].append(t[1:])
from itertools import product
ans = [ (k,) + l + r for k,v in d.items() for l,r in product(*v)]
结果:

[('c', 'beta', 22), ('b', 'alpha', 37)]
与O(nm)相比,它的复杂度更接近O(n+m),因为它避免了计算
乘积(l,r)
,然后像原始方法那样进行过滤

主要来自:Fritz Henglein的关系代数,具有区分连接和惰性积

它也可以写成:

def accumulate(it):
    d = {}
    for e in it:
        d.setdefault(e[0], []).append(e[1:])
    return d
l = accumulate([('a', 'beta'), ('b', 'alpha'), ('c', 'beta')])
r = accumulate([('b', 37), ('c', 22), ('j', 93)])
from itertools import product
ans = [ (k,) + l + r for k in l&r for l,r in product(l[k], r[k])]

这将分别累加两个列表(将
[(a,b,…)]
变成
{a:[(b,…)]}
),然后计算它们的键集之间的交点。这看起来更干净。如果字典之间不支持
l&r
,请将其替换为
set(l)&set(r)

您尝试过什么吗?@depperm我考虑过使用for循环来检查是否匹配并推送到新数组,但我认为可能有一些内置函数可以使其更容易。检查此线程: