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

时间:2015-02-24 08:48:31

标签: python string list set intersection

我经历了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的一部分?

我尝试使用http://www.saltycrane.com/blog/2008/01/how-to-find-intersection-and-union-of/中提到的交叉(a,b) 但是,当我尝试将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)

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

你能帮我找到路口吗?

7 个答案:

答案 0 :(得分:4)

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

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']

答案 1 :(得分:2)

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

这样的列表如下:

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

可以转换为迭代'23@N0', '12@N1'

的迭代器

使用itertools.chain(*),因此我们有简单的oneliner:

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

答案 2 :(得分:1)

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

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))

答案 3 :(得分:1)

如果你必须把它装在幸运饼上:

set(i[0] for i in A).intersection(set(i[0] for i in B))

答案 4 :(得分:0)

您有两个列表列表,每个列表都有一个项目。为了将其转换为集合,您必须使其成为字符串列表:

set_a = set([i[0] for i in A])
set_b = set([i[0] for i in B])

现在你可以得到交叉点:

set_a.intersection(set_b)

答案 5 :(得分:0)

A=[['11@N3'], ['23@N0'], ['62@N0'], ['99@N0'], ['47@N7']]
A=[a[0] for a in A]
B=[['23@N0'], ['12@N1']]
B=[b[0] for b in B]
print set.intersection(set(A),set(B))

输出:set(['23@N0'])

如果您的每个列表都只有1个元素的子列表,您可以试试这个。

答案 6 :(得分:0)

我的偏好是使用标准库中的itertools.chain

from itertools import chain

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

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

set(chain(*A)) & set(chain(*B))

# {'23@N0'}