假设我有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。
答案 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)
如果a
和b
中的值恰好在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))