在Python中将基于其项的两个列表映射为列表对

2024-04-25 01:04:23 发布

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

我有两个列表,基本上需要根据它们的匹配项(list)相互映射。输出是映射的对的列表。当要映射的列表的长度为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']]
    ]

Tags: 代码in列表forifelse子集list
2条回答

出于兴趣,这里有一个使用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中的条件,以完全匹配您想要匹配的内容。你知道吗

只需在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']]]

相关问题 更多 >