如何连接两个不重复的元组列表

问题描述:

我正在对数据库运行两个查询,每个查询得到的结果都是完美的元组列表。我想将这些加入到一个元组列表中。这些都是元组的例子:如何连接两个不重复的元组列表

list1 = [('abc', 1), ('def', 2) ... ] 
list2 = [(1000, 'abc'), (2000, 'def'), (3000, 'def') ... ] 

我想创建只是一个元组的列表,我加入他们这样的:

q = [] 
for i in list1: 
      for j in list2:   
       if i[0] == (j[1]): 
        i = i + (j[0],) 
        q.append(i) 

这将返回我的新名单q重复的,因为我得到的东西像这样的:

q = [('abc', 1 , 1000) , ('def', 2, 2000), ('def', 2, 2000, 3000) ...] 

我如何才能避免重复一样的q列表元组的第二个列表? 我只想要('def', 2, 2000, 3000)而不是这个('def', 2, 2000), ('def', 2, 2000, 3000)

我一直坚持这一段时间,所以任何帮助表示赞赏。谢谢

+0

如果列表很大,对此使用嵌套循环并不是一个好主意。请参阅下面的进一步细节。 –

如果您的列表相当小,但对于较大的列表很快就会变得效率低下,那么使用嵌套循环是可以的。例如,如果len(list1)== 10和len(list2)== 20,则内部循环内的代码将执行200次。

这是一个算法,它通过字典构建所需的元组列表。字典将元组数据存储在列表中,因为它更高效:可以附加到列表,而元组是不可变的,所以每次将元素添加到元组的末尾时,实际上都会创建一个新的元组对象(以及临时的(j[0],)元组),并丢弃绑定到i的旧的元组。

list1 = [('abc', 1), ('def', 2), ('ghi', 3)] 
list2 = [ 
    (1000, 'abc'), 
    (2000, 'def'), 
    (2100, 'def'), 
    (3000, 'ghi'), 
    (3100, 'ghi'), 
    (3200, 'ghi'), 
] 

# Insert list1 data into a dict of lists 
d = {t[0]:list(t) for t in list1} 

# Append list2 data to the correct list 
for v, k in list2: 
    d[k].append(v) 

# Convert lists back into tuples, using the key order from list1 
result = [tuple(d[k]) for k, _ in list1] 
for t in result: 
    print(t) 

输出

('abc', 1, 1000) 
('def', 2, 2000, 2100) 
('ghi', 3, 3000, 3100, 3200) 

在此算法中,如果len(list1的)== 10和len(列表2)== 20则有长度10的环来构建字典d ,一个长度为20的循环,用于将列表2的数据附加到d的列表中,另一个长度为10的循环用于构建元组的最终列表。他步入每个循环都是相当基本的,大致与你的i = i + (j[0],)相当,显然40步比200好很多。当然,如果输入列表每个有1000个项目,那么我的代码将需要3000循环,而使用嵌套循环方法需要100万个循环。

我还应该提到,如果list2包含的密钥不在list1中,则此代码将提高KeyError。据推测,这不是你正在处理的数据的问题,因为你的代码(和Sevanteri's)默默地忽略了这些键。如果您要需要处理这样的密钥,那么这样做相当简单,但如果它不必处理丢失的密钥,那么它会使我的list2回路简单&更高效。

+0

感谢您的详细回复。目前的名单大小只有20,但未来会增长,这是一个更好的长期选择 – johnfk3

你不需要在内部循环内附加i。只是在外部循环的末尾。

q = [] 
for i in list1: 
    for j in list2: 
     if i[0] == j[1]: 
      i = i + (j[0],) 
    q.append(i) 

外环中还有一个错字。应该是list1而不是list

+0

谢谢你我编辑错字,它完美的作品! – johnfk3

+0

你可以在'(j [1])'周围删除paren。它不是一个元组,而是一个简单的值。 –

+0

@LaurentLAPORTE啊,真的。甚至没有注意到一个。 :D – Sevanteri