【问题标题】:Mapping two list of lists based on its items into list pairs in Python在 Python 中将基于其项目的两个列表列表映射到列表对中
【发布时间】:2013-05-03 19:39:47
【问题描述】:

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

【问题讨论】:

  • 为什么[['point', 'floating'],['point']] 不在预期输出中?
  • @ashwini 参见上面的解释。我已经解释过了。
  • length>2(您现在已更新)困扰着我,请参阅下面的解决方案。
  • @AshwiniChaudhary 对不起!那是一个错字。
  • 为什么[['point'], ['floating', 'undefined', 'point']]不在预期的输出中?

标签: python list python-2.7 python-3.x


【解决方案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']]]

【讨论】:

    【解决方案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)
    ))
    

    编辑:

    在阅读了有关该问题的最新 cmets 后,我想我可能误解了确切认为是匹配的内容。在这种情况下,这样的事情可能更合适。

    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 中的条件以完全匹配您想要匹配的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多