繁体   English   中英

找到两个列表之间的共同元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM