检查保留序列的列表列表中的子列表

时间:2017-02-01 15:16:38

标签: python

我有一个列表列表,其中每个列表包含一些单词。每个列表的长度不必与其他列表的长度相同。基本上是:

wordlist = [ ['cat', 'sheep', 'dog', 'pig', 'tomato'], ['apple', 'orange', 'sheep', 'dog' 'tomato'], ['cat', 'apple', 'sheep', 'tomato', 'dog'], ['garlic', 'tomato', 'dog' ]

我还创建了一个可以在所有列表中找到的常用单词列表,对于上面的示例,它将是:

common = ['sheep','dog', 'tomato']

我现在想检查,对于一个列表,如果常用单词以某种顺序出现,其他列表中的单词会以相同的顺序出现。例如,在list1中,常见单词出现在顺序['sheep','dog']中,并且list2中出现相同的顺序,所以我应该返回:

list1: list2

在list3 ['tomato'中,'dog']按顺序出现,它也在list4中出现,所以这两个被映射。使总输出如下:

list1: list2
list2: list1
list3: list4
list4: list3

如果list1具有与其他列表顺序的公共子列表,则它将打印为list1:list2,list5,list7等。它适用于所有子列表。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

解决方案取决于您对列表的期望值。

如果有重复值的可能性,并且您需要检查测试容器中是否有足够的值,那么这是一个时间效率低的解决方案:

def contained(candidate, container):
    temp = container[:]
    try:
        for v in candidate:
            temp.remove(v)
        return True
    except ValueError:
        return False

使用以下方法测试此功能:

>>> a = [1,1,2,3]
>>> b = [1,2,3,4,5]
>>> contained(a,b)
False    
>>> a = [1,2,3]
>>> contained(a,b)
True
>>> a = [1,1,2,4,4]
>>> b = [1,1,2,2,2,3,4,4,5]
>>> contained(a,b)
True