【问题标题】:Checking if list element in list of lists and returning sublist检查列表列表中的列表元素并返回子列表
【发布时间】:2020-10-02 11:19:12
【问题描述】:

我有两个列表

list1 = ['B', 'C', 'D']
list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]

并且想要返回那些包含 list1 元素的 list2 的子列表。 到目前为止,我尝试使用任何:

result = []

for l2 in list2:
    if any (item in l2 for item in list1):
        result.append(l2)

一种天真的方法

for l2 in list2:
    for l1 in l1:
        if l1 in l2:
            result.append(l2)

但我只设法重复空列表。 结果应该是

result = [['2', 'B'], ['5', 'C']]

不确定,我哪里出错了。有没有办法使用列表推导或混合列表推导和“任何”功能?

【问题讨论】:

  • ['3', 'D']在哪里?
  • 您的第一个代码 sn-p 应该给出您预期的输出,而不是空列表。你运行你的代码了吗?
  • 你的第二个代码 sn-p 也是如此 - 除了错字:for l1 in list1:

标签: python python-3.x list any


【解决方案1】:

你所拥有的看起来是正确的,并且在本地也适用于我:

for l2 in list2:
    if any (item in l2 for item in list1):
        result.append(l2)

它返回[['2', 'B'], ['3', 'D'], ['5', 'C']],这是预期的结果吗?

另请注意,您可以通过将 list1 更改为集合 list1 = set(['B', 'C', 'D']) 并将 if 条件更改为 if any (item in list1 for item in l2): 来加快实施速度。
这是因为如果list1set,则item in list1list 快得多。那是因为set 在底层使用了哈希映射来快速访问元素。

【讨论】:

    【解决方案2】:

    试试这个:

    result=[i for i in list2 if any([k in i for k in list1])]
    print(result)
    
    [['2', 'B'], ['3', 'D'], ['5', 'C']]
    

    【讨论】:

      【解决方案3】:

      如果元素是可散列的对象(在这种情况下是字符串),那么您可以使用集合交集:

      >>> list1 = ['B', 'C', 'D']
      >>> list2 = [['1', 'A'], ['2', 'B'], ['3', 'D'], ['5', 'C']]
      
      >>> s = set(list1)
      >>> [l for l in list2 if set(l) & s]
      [['2', 'B'], ['3', 'D'], ['5', 'C']]
      

      如果交集为空,则将其视为错误值,以便列表理解中的 if 过滤器。

      也就是说,我无法重现您在问题中的(第一个)代码为您工作的事实;当我尝试它时它工作正常。您的第二个代码 sn-p(除了拼写错误)在输出中存在重复子列表的潜在问题,因为您在找到第一个匹配项后没有从内部循环中 break

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2021-07-03
        • 2023-01-10
        • 1970-01-01
        相关资源
        最近更新 更多