我经历了Find intersection of two lists?,Intersection of Two Lists Of Strings,Getting 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)
进入一个元组,然后元组可以转换成一个集合。但是,这会返回一个空集作为交集。
你能帮我找到路口吗?
答案 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'}