答案 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)中,其中m
和n
是列表的长度。
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)
这是我发现使用setdefault比collections.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
即可将其过滤掉。