基于迭代内部列表值合并两个外部列表

时间:2011-09-19 20:53:55

标签: python list iteration

5 个答案:

答案 0 :(得分:1)

如果您希望将[[1, 'a'], [2, 'b']][[1, 'c'], [3, 'd']]合并到[[1, 'a', 'c'], [2, 'b'], [3, 'd']]

from collections import defaultdict
dict1_2 = defaultdict(list)
dict1_2.update((item[0], item[1:]) for item in list1)
for item in list2:
    dict1_2[item[0]].append(item[1:])

如果您希望将它们合并到[[1, 'a', 'c']]

dict1 = dict((item[0], item[1:]) for item in list1)
dict1_2 = {}
for item in list2:
    key = item[0]
    if key in dict1:
        dict1_2[key] = dict1[key] + item[1:]

您使用item[0]作为键,因此您应该使用适合它的数据类型。在这种情况下,这是一个字典/映射。

这在线性时间(平均)中起作用,O(m + n)(其中m和n是列表的长度)。使用嵌套循环或类似方法的任何解决方案都是O(m * n)

如果您确实需要将数据作为列表返回,则可以执行

list1_2 = [[key] + value for key, value in dict1_2.iteritems()]

答案 1 :(得分:1)

使用agf的使用collections.defaultdict的想法,这在O(m + n)中,其中mn是列表的长度。

import collections
import itertools

x=[['1', 'expired', 'test', '0'], ['31', 'active', 'test', '1']]
y=[['1', 'Andrew', 'Alexander'], ['31', 'John', 'Smith']]

result=collections.defaultdict(list)
for item in itertools.chain(x,y):
    result[item[0]].append(item)
result=[list(itertools.chain.from_iterable(value)) for value in result.values()]
print(result)

产量

[['1', 'expired', 'test', '0', '1', 'Andrew', 'Alexander'], ['31', 'active', 'test', '1', '31', 'John', 'Smith']]

在评论中,OP表示所需的输出是

[['1', 'expired', 'test', '0', 'Andrew', 'Alexander'], ['31', 'active', 'test', '1', 'John', 'Smith']]

(这与原始问题中发布的所需输出不同。)

然后:

import collections
import itertools

x=[['1', 'expired', 'test', '0'], ['31', 'active', 'test', '1']]
y=[['1', 'Andrew', 'Alexander'], ['31', 'John', 'Smith']]

result={}
for item in itertools.chain(x,y):
    result.setdefault(item[0],item[:1]).extend(item[1:])
result=result.values()
print(result)

这是我发现使用setdefaultcollections.defaultdict更方便的少数几次之一。

答案 2 :(得分:0)

resultlist = []
for x in list1:
    for y in list2:
        if x[0] == y[0]:
            resultlist.append(x+y)

答案 3 :(得分:0)

不是最好的方式,但绝对简洁,难以阅读,如果这就是你所追求的:

>>> l1 = [['1', 'expired', 'test', '0'], ['31', 'active', 'test', '1']]
>>> l2 = [['1', 'Andrew', 'Alexander'], ['31', 'John', 'Smith']]

>>> [sl1 + list(*[sl2[1:] for sl2 in l2 if sl2[0]==sl1[0]]) for sl1 in l1]

[['1', 'expired', 'test', '0', 'Andrew', 'Alexander'], ['31', 'active', 'test', '1', 'John', 'Smith']]

请不要在任何实际代码中使用它。

答案 4 :(得分:0)

l1 = [['1', 'expired', 'test', '0'], ['31', 'active', 'test', '1']]
l2 = [['1', 'Andrew', 'Alexander'], ['31', 'John', 'Smith'], ['51', 'Johnny', 'Nomatch']]

from itertools import groupby, chain
from operator import itemgetter

all = sorted(chain(l1,l2), key=itemgetter(0)) # puts the related lists together
groups = groupby(all, itemgetter(0)) # groups them by first element
chains = (group for key, group in groups) # get each group
print [list(chain.from_iterable(g)) for g in chains] # merge them

这是一个oneliner; - )

包含不匹配的项目。您只需选中len(group) > 4即可将其过滤掉。