list1=[1,3,8,10,23,8,8,10,23,3,8,10,23,3,8,10,23]
list2=[10,23,3]
cnt=list1.count(list2[0])
cnt1=1
j=0
while (cnt1<=cnt):
list3=[]
list3.append(list2[0])
i=1
k=list1.index(list2[0])
while (i<len(list2)):
list3.append(list1[k+i])
i=i+1
print (list3)
if (list2==list3):
print ("list2 is a subset")
j=j+1
else:
print ("list2 is not a subset")
list1.remove(list2[0])
cnt1=cnt1+1
print (list2,"occurs",j,"times")
我收到此错误。
Traceback (most recent call last): File "C:\Python26\Lib\idlelib\sublist.py", line 12, in <module> list3.append(list1[k+i]) IndexError: list index out of range"
答案 0 :(得分:5)
你肯定过于复杂 - 至于你的策略究竟是什么并不明显。
这是一个你可以尝试和整合的简单算法:
list2
list1
,访问长度list2
列表的切片(例如,第一个切片为[1, 3, 8]
,然后下一个切片为[3, 8, 10]
list2
- 如果是,则返回True(或将1添加到计数器)答案 1 :(得分:1)
您可以测试适当长度的所有list1
切片与list2
的相等。然后,您可以使用sum
来获取出现次数:
list1 = [1,3,8,10,23,8,8,10,23,3,8,10,23,3,8,10,23]
list2 = [10,23,3]
l1, l2 = len(list1), len(list2)
num_occurrences = sum(list1[i:i+l2] == list2 for i in range(l1 - l2 + 1))
# 2
答案 2 :(得分:0)
这是一种可行的方法:
from collections import deque
from itertools import islice
list1=[1,3,8,10,23,8,8,10,23,3,8,10,23,3,8,10,23]
list2=[10,23,3]
size = len(list2)
# convert to a queue
items = deque(list1)
count = 0
# iterate until no more sublists can be extracted
while len(items) >= size:
current = list(islice(items, 0, size))
# if the current sublist is equal to list1, increment count
if current == list2:
count += 1
# pop the first element from this queue, ready for next sublist
items.popleft()
print (list2,"occurs",count,"times")
哪个输出:
[10, 23, 3] occurs 2 times
上述代码的方法:
list1
转换为collections.deque
对象,该对象可以在O(1)
时间内从正面弹出对象。这是代码中的items
。count
个相同的列表,其中包含list2
。current
子列表(n
中的第一个items
元素作为列表)是否等于list2
。如果相等则增加计数。items
弹出popleft()
中的第一项,为下一个子列表做好准备。因此,如果我的列表为[1, 2, 3, 4]
,则在处理[1, 2, 3]
后,从1
弹出items
,然后检查下一个子列表[2, 3, 4]
。 size
个子列表。然后你可以在最后打印出计数。