我有两个列表,基本上需要根据匹配项(列表)相互映射。输出是映射的对列表。当要映射的列表长度为1时,我们可以在另一个列表中查找直接匹配。当要映射的列表长度> 1时,出现问题。 1我需要找到的地方,如果A中的列表是B的子集。
输入:
A = [['point'], ['point', 'floating']]
B = [['floating', 'undefined', 'point'], ['point']]
我的代码失败:
C = []
for a in A:
for b in B:
if a == b:
C.append([a, b])
else:
if set(a).intersection(b):
C.append([a, b])
print C
预期输出:
C = [
[['point'], ['point']],
[['point', 'floating'], ['floating', 'undefined', 'point']]
]
答案 0 :(得分:1)
只需在elif
语句中添加长度条件:
import pprint
A = [['point'], ['point', 'floating']]
B = [['floating', 'undefined', 'point'], ['point']]
C = []
for a in A:
for b in B:
if a==b:
C.append([a,b])
elif all (len(x)>=2 for x in [a,b]) and not set(a).isdisjoint(b):
C.append([a,b])
pprint.pprint(C)
<强>输出:强>
[[['point'], ['point']],
[['point', 'floating'], ['floating', 'undefined', 'point']]]
答案 1 :(得分:1)
为了利益,这里是使用itertools.ifilter
的“一行”实现。
from itertools import ifilter
C = list(ifilter(
lambda x: x[0] == x[1] if len(x[0]) == 1 else set(x[0]).issubset(x[1]),
([a,b] for a in A for b in B)
))
修改强>
在阅读了有关该问题的最新评论后,我想我可能误解了究竟被认为是匹配的内容。在这种情况下,这样的事情可能更合适。
C = list(ifilter(
lambda x: x[0] == x[1] if len(x[0])<2 or len(x[1])<2 else set(x[0]).intersection(x[1]),
([a,b] for a in A for b in B)
))
无论哪种方式,基本概念都是一样的。只需更改lamba中的条件即可完全匹配您想要匹配的内容。