Python 3:检查整个列表是否在另一个列表中

时间:2013-11-17 21:51:54

标签: python list

假设我有2个名单:
a = [6,7,8,9,10]
b = [1,3,4,6,7,8,9,10]

我有一个函数用于查明列表是否可以在列表b 中找到。如果找到,则返回 True 。在我的情况下,它应该返回 True ,因为列表可以在 list b 的末尾找到。 列出从不更改并且始终包含相同的数字,而 list b 接受来自用户的数字,然后使用sorted()方法按升序对数字进行排序。我还要补充说,订单确实很重要。

我已经搜索过,可以找到一个子集方法,如下所示:set(a).issubset(set(b)))以及使用in方法。他们两个都不适合我。

更新: 由于某种原因使用set(a).issubset(set(b)))始终返回True。例如,如果   a = [1,1]b = [0,1,2,3,4,5]然后使用子集方法返回True,即使在b中找不到1,1。我不是在查看列表中是否有1,我正在查看列表中是否有1,1。

当用时使用in方法 a = [6,7,8,9,10]
b = [1,3,4,6,7,8,9,10]返回False。

6 个答案:

答案 0 :(得分:2)

你没有说速度有多重要。所以我将这个功能包装在一个类中,这样你就可以隐藏其余代码的复杂性,如果你以后需要更好的。由于

  

列出永不更改并始终包含相同的数字

a传递给类构造函数是有意义的。这是一种方式:

class ASearcher:
    def __init__(self, a):
        self.a = a
    def isin(self, b):
        a = self.a
        a0 = a[0]
        lena = len(a)
        i = 0
        try:
            while 1:
                j = b.index(a0, i) # raises ValueError if not found
                if a == b[j: j+lena]:
                    return True
                i = j+1  # start search over 1 position later
        except ValueError:
            return False

然后,例如,

asearch = ASearcher([6,7,8,9,10])
print asearch.isin([1,3,4,6,7,8,9,10])

打印True

标准库中没有任何功能可以在此处执行您想要的操作,因此您需要自己动手。上面的类实现了一个方法,在B中搜索A的第一个元素,“以C速度”。它可能“足够快” - 也许; - )

答案 1 :(得分:1)

如果ab中的值恰好在0-255范围内,您可以使用此技巧

>>> a = [6,7,8,9,10]
>>> b = [1,3,4,6,7,8,9,10]
>>> bytearray(a) in bytearray(b)
True

答案 2 :(得分:0)

这是一种蛮力的方式:

a = [6,7,8,9,10]
b = [1,3,4,6,7,8,9,10]

def check_if_in_list(a, b):
    for i in xrange(len(b) - len(a) + 1):
        if a == b[i : i + len(a)]:
            return True
    return False

结果:

>>> check_if_in_list(a, b)
True

答案 3 :(得分:0)

如果我理解你,你有兴趣知道a是否是b的连续子序列。所以:

>>> a = [6,7,8,9,10]
>>> b = [1,3,4,6,7,8,9,10]
>>> any(b[i:i+len(a)] == a for i in range(len(b)-len(a)+1))
True

这不是最有效的方法,但在实践中通常足够快。

答案 4 :(得分:0)

你认为有用的东西

idx = -1
notfound = False
for index, item in enumerate(b):
    if item == a[0]:
        idx = index
if idx == -1:
    notfound = True
for i in xrange(idx, len(a) + idx):
    if len(b) <= i or a[i - idx] != b[i]:
        notfound = True
print "Not found: ", notfound

答案 5 :(得分:0)

您不需要遍历每个索引。只需找到第一个元素,然后查看余数元素匹配。

你可以沿着这些方向做点什么:

a = [6,7,8,9,10]
b = [1,3,4,6,7,8,9,10]

def liAinliB(a, b):
    try:
        ind=b.index(a[0])
    except ValueError:
        return False

    return b[ind:ind+len(a)]==a

print(liAinliB(a, b))