【问题标题】:Python check next three elements in list [duplicate]Python检查列表中的下三个元素[重复]
【发布时间】:2013-09-26 10:25:07
【问题描述】:

我不确定以前是否有人问过这个问题,但我在问题列表中找不到类似的东西。我想检查一个列表是否按特定顺序包含一组三个值。例如,我想检查一个 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: 列表索引超出范围

编辑:感谢那些回答并感谢您列出子列表问题的人。我从没想过整数的集合可以被认为是一个子列表,并用它来与一个更大的列表进行比较。

【问题讨论】:

标签: python list for-loop


【解决方案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】:

    i + 2 在循环体中太大,nums 没有那么多元素。像这样修复它:

    if i + 2 < len(nums) and (nums[i+2] - nums[i+1] == nums[i+1] - nums[i]) == 1:
        ...
    

    【讨论】:

    • 或者,如果您在循环中不做任何可能需要您到达末尾的其他操作,您可以将范围更改为 range(len(nums) - 2)
    【解决方案3】:

    您可以直接使用元组比较以及 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
    

    【讨论】:

      【解决方案4】:

      我正在考虑使用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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 2015-03-20
        • 1970-01-01
        相关资源
        最近更新 更多