2024-06-06 04:48:06 发布
网友
我有两个python列表,如下所示
list1=[['a',1],['b',2],['c',3],['h',5]] list2=[['d',1],['e',2],['f',3],['g',4]]
现在list1中的list元素有时与list2中的list元素共用。你知道吗
list1
list2
我想得到第三个列表(仅适用于公共元素),如下所示
list3=[['a',1,'d'],['b',2,'e'],['c',3,'f']]
我不知道该怎么做。你知道吗
把你的第二个列表放到字典里;在列表理解中查找连接是很简单的:
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)解,例如,它会随着你放入list1和list2的元素的增加而线性增长。你知道吗
它还将处理多个匹配;例如,如果第二个位置的任何整数在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筛选器。你知道吗
mapping[b][:1]
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的任何地方。如果只想比较每个项目的第二个项目,可以使用:
e1
e2
if e1[1] == e2[1]:
相反
把你的第二个列表放到字典里;在列表理解中查找连接是很简单的:
这是一个O(N+M)解,例如,它会随着你放入
list1
和list2
的元素的增加而线性增长。你知道吗它还将处理多个匹配;例如,如果第二个位置的任何整数在
list2
中出现多次。你知道吗演示:
如果只需要添加一个元素,请使用
mapping[b][:1]
。如果需要包含来自list1
的元素,而这些元素在list2
中没有出现,请使用mapping.get(b, [])
并删除if b in mapping
筛选器。你知道吗如果要仅检查具有相同编号的对应元素,则以下内容就足够了:
你可以这样做:
我应该注意到,这个解决方案通常会检查
e1
的第二个条目是否在e2
的任何地方。如果只想比较每个项目的第二个项目,可以使用:相反
相关问题 更多 >
编程相关推荐