![](/img/trans.png)
[英]Fastest way of finding common elements between two list of lists in python
[英]finding common elements between two lists?
我有两个格式如下的列表:
sortedAlt=[['TIF35', 'TIF35'], ['PTP1', 'SSM4'], ['AMD1', 'PRP40'], ['END3', 'RAD26']]
sortedB=[['SDP1', 'SLT2'], ['ATG34', 'GCD7'], ['END3', 'RAD26'], ['TIF35', 'TIF35']]
我需要找到两个列表之间的共享元素。 我尝试了几件事:
这两个只返回 []:
sharedEdges = []
temp = [sharedEdges.add((a, b)) for (a, b) in sortedB
if (a, b) in sortedAlt]
for (a,b) in sortedAlt:
print((a,b))
if (a,b) in sortedB:
sharedEdges.add((a,b))
print(sharedEdges)
对于上面的代码,我很确定问题出在 if 语句中; 如果我对两者使用相同的列表输入,我仍然得到一个空的 output。
如果我尝试使用交集 function,我会收到错误:TypeError: unhashable type: 'list'
sharedEdges = set(sortedAlt) & set(sortedB)
sharedEdges = list(set(sortedAlt)-set(sortedAlt))
print(sharedEdges)
将内部列表转换为元组,因此它们是可散列的。 然后你可以使用
sortedAlt=[['TIF35', 'TIF35'], ['PTP1', 'SSM4'], ['AMD1', 'PRP40'], ['END3', 'RAD26']]
sortedB=[['SDP1', 'SLT2'], ['ATG34', 'GCD7'], ['END3', 'RAD26'], ['TIF35', 'TIF35']]
sharedEdges = set(tuple(i) for i in sortedAlt).intersection( (tuple(i) for i in sortedB))
print(sharedEdges)
Output:
{('END3', 'RAD26'), ('TIF35', 'TIF35')}
对于更大的列表,这比使用in
的列表理解更快,并且可能与 OlvinRoghts 评论 map 相提并论 - 解决方案:
# slightly modified from OlvinRoght comment on the question: s = list(map(list, set(map(tuple, sortedAlt)).intersection(map(tuple, sortedB)))) # [['TIF35', 'TIF35'], ['END3', 'RAD26']]
考虑到内部数组元素可以是非排序方式,根据字符顺序对它们进行排序然后比较
A=[['TIF35', 'TIF35'], ['PTP1', 'SSM4'], ['AMD1', 'PRP40'], ['END3', 'RAD26']]
B=[['SDP1', 'SLT2'], ['ATG34', 'GCD7'], ['END3', 'RAD26'], ['TIF35', 'TIF35']]
tmp_b = [sorted(inner_list) for inner_list in B]
res = []
for inner_list in A:
if sorted(inner_list) in tmp_b:
res.append(inner_list)
print(res)
#OUTPUT [['TIF35', 'TIF35'], ['END3', 'RAD26']]
考虑到元素的内部列表顺序无关紧要,然后按照@patrickartner 的建议使用集合操作,这将使时间复杂度变小
res = list(set(tuple(i) for i in A).intersection(set(tuple(i) for i in B)))
下面(将列表转换为元组并使用集合)
sortedAlt=[['TIF35', 'TIF35'], ['PTP1', 'SSM4'], ['AMD1', 'PRP40'], ['END3', 'RAD26']]
sortedB=[['SDP1', 'SLT2'], ['ATG34', 'GCD7'], ['END3', 'RAD26'], ['TIF35', 'TIF35']]
sortedAltTuple = set(tuple(x) for x in sortedAlt)
sortedBTuple = set(tuple(x) for x in sortedB)
intersections = sortedAltTuple.intersection(sortedBTuple)
print(intersections)
output
{('END3', 'RAD26'), ('TIF35', 'TIF35')}
更简单的方法确实是使用集合,但集合只接受可哈希对象。 列表不可哈希,但元组可以。 所以更简单的是在构造集合之前将列表转换为元组。
shared_edges = set(map(tuple, sorted_alt)) & set(map(tuple, sorted_b))
shared_edges = list(map(list, shared_edges)) # then go back to lists if you want
顺便说一句,请使用蛇形大小写 ( shared_edges
) 而不是混合大小写 ( sharedEdges
)。 这是 Python 编码约定,请参阅PEP8 。
我有两个格式如下的列表:
sortedAlt=[['TIF35', 'TIF35'], ['PTP1', 'SSM4'], ['AMD1', 'PRP40'], ['END3', 'RAD26']]
sortedB=[['SDP1', 'SLT2'], ['ATG34', 'GCD7'], ['END3', 'RAD26'], ['TIF35', 'TIF35']]
我需要找到两个列表之间的共享元素。 我尝试了几件事:
这两个只返回 []:
sharedEdges = []
temp = [sharedEdges.add((a, b)) for (a, b) in sortedB
if (a, b) in sortedAlt]
for (a,b) in sortedAlt:
print((a,b))
if (a,b) in sortedB:
sharedEdges.add((a,b))
print(sharedEdges)
对于上面的代码,我很确定问题出在 if 语句中; 如果我对两者使用相同的列表输入,我仍然会得到一个空输出。
如果我尝试使用相交函数,我会收到错误:TypeError: unhashable type: 'list'
sharedEdges = set(sortedAlt) & set(sortedB)
sharedEdges = list(set(sortedAlt)-set(sortedAlt))
print(sharedEdges)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.