python两个元组如何合并_python – 如何基于密钥合并两个元组列表?

本文介绍了如何使用Python高效地合并两个元组列表,特别是在第一列存在相同键的情况下进行内连接操作。通过`itertools.groupby()`、`heapq.merge()`和字典方法提供了解决方案,并对比了它们的时间复杂度和内存效率。
摘要由CSDN通过智能技术生成

内部连接使用

itertools.groupby()

suggested by @CoryKramer in the comments在第一列(每个列表中唯一)列中的两个元组列表:

from itertools import groupby

from operator import itemgetter

def inner_join(a, b):

L = a + b

L.sort(key=itemgetter(0)) # sort by the first column

for _, group in groupby(L, itemgetter(0)):

row_a, row_b = next(group), next(group, None)

if row_b is not None: # join

yield row_a + row_b[1:] # cut 1st column from 2nd row

例:

result = list(inner_join(listA, listB))

assert result == listC

该解决方案具有O(n * log n)时间复杂度(您的解决方案(在问题中)是O(n * n),对于n~10000来说更糟糕).

对于问题中的小问题(例如10 ** 4)并不重要,但在Python 3.5中,您可以使用带有关键参数的heapq.merge()来避免分配新列表,即对于O(1)常量内存解决方案:

from heapq import merge # merge has key parameter in Python 3.5

def inner_join(a, b):

key = itemgetter(0)

a.sort(key=key)

b.sort(key=key)

for _, group in groupby(merge(a, b, key=key), key):

row_a, row_b = next(group), next(group, None)

if row_b is not None: # join

yield row_a + row_b[1:] # cut 1st column from 2nd row

这是一个基于字典的解决方案.它是时间和空间算法中的O(n)线性:

def inner_join(a, b):

d = {}

for row in b:

d[row[0]] = row

for row_a in a:

row_b = d.get(row_a[0])

if row_b is not None: # join

yield row_a + row_b[1:]

from collections import defaultdict

from itertools import chain

def inner_join(a, b):

d = defaultdict(list)

for row in chain(a, b):

d[row[0]].append(row[1:])

for id, rows in d.iteritems():

if len(rows) > 1:

assert len(rows) == 2

yield (id,) + rows[0] + rows[1]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值