如何加入两个没有重复的元组列表

时间:2016-08-18 11:26:35

标签: python list tuples sql-server-express

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

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)

我已经坚持了一段时间,所以任何帮助都表示赞赏。谢谢

2 个答案:

答案 0 :(得分:5)

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

这是一种通过字典构建所需元组列表的算法。字典将元组数据存储在列表中,因为它更有效:它可以附加到列表,而元组是不可变的,所以每次你使用i = i + (j[0],)将元素添加到元组的末尾时,你实际上是在创建一个元组新元组对象(以及临时(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(list2)== 20那么我们有一个长度为10的循环来构建字典d,一个长度为20的循环来附加list2数据到d的列表,另一个长度为10的循环用于构建最终的元组列表。他在每个循环中的步骤是相当基本的,大致与你的i = i + (j[0],)相当,显然40步比200更好。当然如果输入列表每个有1000个项目,那么我的代码将需要3000循环与嵌套循环方法所需的一百万个循环形成对比。

我还应该提一下,如果KeyError包含不在list2中的密钥,则此代码会引发list1。据推测,这不是您正在处理的数据的问题,因为您的代码(和Sevanteri的)默默地忽略了这些键。如果你需要处理这样的键,这样做很简单,但它使我的list2循环变得更简单&amp;如果它不必处理丢失的密钥,则效率更高。

答案 1 :(得分:0)

您不需要在内循环中附加arr = [1, 0, 0, 1, 0, 0, 1, 0] # I'm taking your sample case. Take the input the way you want count,count_max,ones = 0,0,0 for i in arr: if i == 1: ones += 1 count -= 1 if i == 0: count += 1 if count_max < count: count_max = count if count < 0: count = 0 print (ones + count_max) 。只有一次在外循环的末尾。

i

外圈还有一个拼写错误。它应该是q = [] for i in list1: for j in list2: if i[0] == j[1]: i = i + (j[0],) q.append(i) ,而不仅仅是list1