Python 检查列表中的子列表
问题是:您要编写一个名为Python 检查列表中的子列表,python,sublist,Python,Sublist,问题是:您要编写一个名为isSublist()的函数,它接受两个参数(list,sublist),如果sublist是list的子列表,则返回1,否则返回0 所以我有我的代码,但是当子列表不在列表中时,我得到True。有什么建议可以解决这个问题吗 def isSublist(list, sublist): for i in range(len(list)-(len(sublist))+1): return True if sublist==list[i:i+(l
isSublist()
的函数,它接受两个参数(list,sublist
),如果sublist是list的子列表,则返回1
,否则返回0
所以我有我的代码,但是当子列表不在列表中时,我得到True
。有什么建议可以解决这个问题吗
def isSublist(list, sublist):
for i in range(len(list)-(len(sublist))+1):
return True
if sublist==list[i:i+(len(sublist))]:
return False
样本输入:
list= (0,1,2,3,4,5,6,7,8,9)
isSublist(list, [1,2,3])
output:
True
您可以通过获取子列表大小的所有切片并比较相等性来打破这一点:
def n_slices(n, list_):
for i in xrange(len(list_) + 1 - n):
yield list_[i:i+n]
def isSublist(list_, sub_list):
for slice_ in n_slices(len(sub_list), list_):
if slice_ == sub_list:
return True
return False
包括订购问题。根据定义,列表是有序的。如果我们想忽略订购,您可以执行以下操作:
def isSubset(list_, sub_list):
return set(sub_list) <= set(list_)
测试输出:
>>> isSublist([1,2,4],[1,2,4],[1,2,3,4])
False
>>> isSublist([1,2,3],[1,2,3],[1,2,3,4])
True
>>>
为子列表而不是子集编辑。更丑陋,但有效。可以添加包装器以避免参数混淆
def sublist(a,b):
isSublist(a,a,b)
部分问题在于Python中的
(0,1,2,3,4,5,6,7,8,9)
从技术上讲不是一个列表
,而是一个元组
——它本质上是一个不可变(不可更改)的列表
。此外,您应该避免将程序中的内容命名为与内置函数和类型相同的名称,因为有时您需要引用它们,并且您自己的定义会隐藏系统提供的内容
解决这个问题的一个简单方法是只在名称的末尾添加一个
,如下所述,如果一开始不是一个列表,则尝试将参数转换为列表。它不测试子列表
参数的类型,但类似的检查可能也适用于它
def isSublist(list_, sublist):
if not isinstance(list_, list):
list_ = list(list_)
sublen = len(sublist)
for i in xrange(len(list_)-sublen+1):
if list_[i:i+sublen] == sublist:
return True
return False
list_ = (0,1,2,3,4,5,6,7,8,9)
print subfunc(list_, [0,1]) # --> True
print subfunc(list_, [1,2,3]) # --> True
print subfunc(list_, [4,6,7]) # --> False
print subfunc(list_, [4,5]) # --> True
我刚刚为此编写了一个配方(这适用于连续子列表):
其思想是让一个移动窗口(与候选子列表具有相同的宽度)扫描超列表,并在每次迭代中检查块和子列表之间的相等性
这是一种蛮力方法。您能提供示例输入和预期输出吗?当你说sublist时,你是指[1,2,3],[5,6,7]
中的[1,2,3],还是指[1,2,3,4,5,6]
中的[1,2,3]?请简单地定义一下列表的子列表是什么意思,顺序是否算数?您希望两个子列表的输出相同吗[1,2,3]
和[2,3,1]
?我所说的子列表是指列表[1,2,3,4]中[1,2]的子列表。如果是,则打印True,如果不是false,那么子列表=[2,1]
呢?如果list=[1,1,2,2,3]
和sublist=[1,2,3]
?isSublist([1,2,4],[1,2,3,4])
返回True
,错误。OP没有说明顺序是否重要,所以您不可能如此确定。sublist,而不是subset。子集将是一个简单的返回集(sublist)它是一个子列表而不是subsetset有对不起,我没有看到原始的发布日期和所有现有的答案。我将留下我的答案,因为它的语法和类型检查与其他答案略有不同。
def sublist(a,b):
isSublist(a,a,b)
def isSublist(list_, sublist):
if not isinstance(list_, list):
list_ = list(list_)
sublen = len(sublist)
for i in xrange(len(list_)-sublen+1):
if list_[i:i+sublen] == sublist:
return True
return False
list_ = (0,1,2,3,4,5,6,7,8,9)
print subfunc(list_, [0,1]) # --> True
print subfunc(list_, [1,2,3]) # --> True
print subfunc(list_, [4,6,7]) # --> False
print subfunc(list_, [4,5]) # --> True
def isSublist(x, y):
occ = [i for i, a in enumerate(x) if a == y[0]]
for b in occ:
if x[b:b+len(y)] == y:
print 'YES-- SUBLIST at : ', b
return True
else:
pass
if len(occ)-1 == occ.index(b):
print 'NO SUBLIST'
return False
list1 = [1,0,1,1,1,0,0]
list2 = [1,0,1,0,1,0,1]
#should return True
isSublist(list1, [1,1,1])
#Should return False
isSublist(list2, [1,1,1])
def is_sublist(sublist, superlist):
'''''
Checks whether 'sublist' is a sublist of 'superlist'.
Both arguments must be typed list or tuple.
'''
if not isinstance(sublist, (list, tuple)) or not isinstance(sublist, (list,tuple)):
raise TypeError("Both 'sublist' and 'superlist' must be lists or tuples.")
# Return early if candidate sublist is longer than superlist
if len(sublist) > len(superlist):
return False
else:
for chunk in (superlist[i:i+len(sublist)] for i in range(0, len(superlist)-len(sublist)+1)):
if chunk == sublist:
return True
return False