在python中查找两个字符串列表的交集

2024-06-09 21:37:17 发布

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

我经历过Find intersection of two lists?Intersection of Two Lists Of StringsGetting intersection of two lists in python。但是,我无法使用Python解决在两个字符串列表之间找到交集的问题。

我有两个变量。

A = [['11@N3'], ['23@N0'], ['62@N0'], ['99@N0'], ['47@N7']]

B  = [['23@N0'], ['12@N1']]

如何找到'23@N0'是a和B的一部分?

我试着使用intersect(a,b)如http://www.saltycrane.com/blog/2008/01/how-to-find-intersection-and-union-of/所述 但是,当我试图将A转换为set时,它会抛出一个错误:

File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'

为了将其转换为一个集合,我使用了TypeError: unhashable type: 'list' when using built-in set function中的方法,其中可以使用

result = sorted(set(map(tuple, A)), reverse=True)

一个元组,然后元组可以转换成一个集合。但是,这将返回一个空集合作为交集。

你能帮我找到十字路口吗?


Tags: ofintypefindlistslist经历元组
3条回答

您的数据结构有点奇怪,因为它是字符串的一个元素列表;您希望将它减少为字符串列表,然后可以应用以前的解决方案:

因此一个列表如下:

B = [['23@N0'], ['12@N1']]

可以转换为在'23@N0', '12@N1'上迭代的迭代器

有了itertools.chain(*),我们就有了简单的一行:

>>> set(chain(*A)).intersection(chain(*B))
{'23@N0'}

您可以使用compiler.ast模块的flatten函数展平子列表,然后应用这样的集合交集

from compiler.ast import flatten

A=[['11@N3'], ['23@N0'], ['62@N0'], ['99@N0'], ['47@N7']]
B=[['23@N0'], ['12@N1']]

a = flatten(A)
b = flatten(B)
common_elements = list(set(a).intersection(set(b)))
common_elements
['23@N0']

问题是您的列表包含子列表,因此无法将它们转换为集合。试试这个:

A=[['11@N3'], ['23@N0'], ['62@N0'], ['99@N0'], ['47@N7']]
B=[['23@N0'], ['12@N1']]

C = [item for sublist in A for item in sublist]
D = [item for sublist in B for item in sublist]

print set(C).intersection(set(D))

相关问题 更多 >