我不确定此问题是否曾被提出,但我在问题列表中找不到类似的内容。我想检查列表是否按特定顺序具有一组三个值。例如,我想检查一个int列表是否在该列表中的任何位置都有一组值1,2,3。列表的长度未知,列表无法排序。
示例:
Values to check: 1, 2, 3 (in this order)
Example of a list = [1, 1, 2, 3, 1]
这是我到目前为止所尝试过的。
list1 = [1, 1, 2, 3, 1]
list2 = [1, 1, 4, 3, 1, 2, 1]
def checkValue:
for i in range (0, len(nums)):
if (nums[i+2] - nums[i+1] == nums[i+1] - nums[i]) == 1:
return True
return False
list1 - >返回True list2 ---> IndexError:列表索引超出范围
编辑:感谢那些回答并感谢您列出子列表问题的人。我从未想过整数集可以被视为一个子列表,并用它来比较一个更大的列表。
答案 0 :(得分:1)
i + 2
在循环体中太大,nums
没有那么多元素。修复如下:
if i + 2 < len(nums) and (nums[i+2] - nums[i+1] == nums[i+1] - nums[i]) == 1:
...
答案 1 :(得分:1)
看起来你正在搜索列表中的序列。
您只需将列表中的部分内容与序列进行比较即可。
def find_sequence_in_list(list_to_check, values):
for i in range (len(list_to_check) - len(values) + 1):
#print(list_to_check[i:i + len(values)])
if list_to_check[i:i + len(values)] == values:
return True
return False
values = [1, 2, 3]
data1 = [1, 1, 2, 3, 1]
data2 = [1, 1, 4, 3, 1, 2, 1]
print(find_sequence_in_list(data1, values))
print(find_sequence_in_list(data2, values))
取消注释print
以查看正在发生的事情。
答案 2 :(得分:0)
您可以直接使用元组比较,以及zip迭代(如果您愿意,可以使用itertools.izip
,对于一般的迭代):
>>> def findin(values, nums):
... t = tuple(values)
... return any(T == t for T in zip(*(nums[i:] for i in xrange(values))))
这给出了你的例子:
>>> findin([1,2,3], [1,1,2,3,1])
True
>>> findin([1,2,3], [1, 1, 4, 3, 1, 2, 1])
False
答案 3 :(得分:0)
我正在考虑将deque
用于子列表比较。
from collections import deque
def has_sublist(lst, sub):
tmp_q = deque([], maxlen=len(sub))
sub_q = deque(sub)
for i in nums:
if tmp_q == sub_q:
return True
else:
tmp_q.append(i)
return tmp_q == sub_q
tmp_q
的最大长度为len(sub)
(在您的示例中为3),它包含要搜索的列表子列表。
让我们检查它是否运作良好:
>>> lst = [1, 1, 4, 3, 1, 2, 1]
>>> sub = [1, 2, 3]
>>> print has_sublist(lst, sub)
False
>>> lst = [1, 1, 4, 3, 1, 2, 3]
>>> print has_sublist(lst, sub)
True
>>> lst = [1, 2]
>>> print find(lst, sub)
False
>>> lst = [1, 2, 3]
>>> print has_sublist(lst, sub)
True
在这种情况下,您无需担心IndexError
。