在Python2.7中映射2个列表

2024-06-06 04:48:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个python列表,如下所示

list1=[['a',1],['b',2],['c',3],['h',5]]
list2=[['d',1],['e',2],['f',3],['g',4]]

现在list1中的list元素有时与list2中的list元素共用。你知道吗

我想得到第三个列表(仅适用于公共元素),如下所示

list3=[['a',1,'d'],['b',2,'e'],['c',3,'f']]

我不知道该怎么做。你知道吗


Tags: 元素列表listlist2list1共用list3
3条回答

把你的第二个列表放到字典里;在列表理解中查找连接是很简单的:

mapping = {}
for a, b in list2:
    mapping.setdefault(b, []).append(a)
list3 = [[a, b] + mapping[b] for a, b in list1 if b in mapping]

这是一个O(N+M)解,例如,它会随着你放入list1list2的元素的增加而线性增长。你知道吗

它还将处理多个匹配;例如,如果第二个位置的任何整数在list2中出现多次。你知道吗

演示:

>>> list1 = [['a', 1], ['b', 2], ['c', 3], ['h', 5]]
>>> list2 = [['d', 1], ['e', 2], ['f', 3], ['g', 4]]
>>> mapping = {}
>>> for a, b in list2:
...     mapping.setdefault(b, []).append(a)
... 
>>> [[a, b] + mapping[b] for a, b in list1 if b in mapping]
[['a', 1, 'd'], ['b', 2, 'e'], ['c', 3, 'f']]

如果只需要添加一个元素,请使用mapping[b][:1]。如果需要包含来自list1的元素,而这些元素在list2中没有出现,请使用mapping.get(b, [])并删除if b in mapping筛选器。你知道吗

如果要仅检查具有相同编号的对应元素,则以下内容就足够了:

list3 = [(a, b, c) for (a, b), (c, d) in zip(list1, list2) if b == d]

你可以这样做:

list3 = []
for e1 in list1:
    for e2 in list2:
        if e1[1] in e2:
            list3.append([e1[0], e1[1], e2[0]])

我应该注意到,这个解决方案通常会检查e1的第二个条目是否在e2的任何地方。如果只想比较每个项目的第二个项目,可以使用:

if e1[1] == e2[1]:

相反

相关问题 更多 >