【问题标题】:How do you find common sublists between two lists? [duplicate]你如何找到两个列表之间的共同子列表? [复制]
【发布时间】:2014-01-30 05:12:24
【问题描述】:

如果子列表也存在于另一个列表中,您如何查找或仅保留列表的子列表?

lsta = [['a','b','c'],['c','d','e'],['e','f','g']]
lstb = [['a','b','c'],['d','d','e'],['e','f','g']]

我想做一些类似 set(lsta) & set(lstb) 的事情

Desired_List = [['a','b','c'],['e','f','g']]

我想做 set 之类的事情的原因是它的速度,因为我在一个非常重要的列表中执行此操作,效率非常重要。

另外,有点不相关,如果我想从 lsta 中减去 lstb 得到

Desired_List2 = [['d','d','e']]

【问题讨论】:

    标签: python list set sublist


    【解决方案1】:

    最好将列表列表更改为元组列表,然后您可以轻松使用集合操作:

    >>> tupa = map(tuple, lsta)
    >>> tupb = map(tuple, lstb)
    >>> set(tupa).intersection(tupb)
    set([('a', 'b', 'c'), ('e', 'f', 'g')])
    >>> set(tupa).difference(tupb)
    set([('c', 'd', 'e')])
    

    【讨论】:

    • 使用集合的另一个便利是&-的重载:tupa - tupbtupa & tupb
    • 如果元组中元素的顺序是任意的,即('a','b','c')在一个列表中,('b','a','c')在另一个列表中,这是否可行?
    【解决方案2】:

    如果您的子列表需要保留列表,请使用list comprehension

    路口:

    >>> [i for i in lsta if i in lstb]
    [['a', 'b', 'c'], ['e', 'f', 'g']]
    

    减法:

    >>> [i for i in lsta if i not in lstb]
    [['c', 'd', 'e']]
    

    【讨论】:

      【解决方案3】:

      我不久前为此写过a C module

      >>> lsta = [['a','b','c'],['c','d','e'],['e','f','g']]
      >>> lstb = [['a','b','c'],['d','d','e'],['e','f','g']]
      >>> list(boolmerge.andmerge(lsta, lstb))
      >>> import boolmerge
      [['a', 'b', 'c'], ['e', 'f', 'g']]
      

      这是 O(n) 时间,需要对列表进行排序。

      【讨论】:

        猜你喜欢
        • 2015-12-15
        • 2021-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多