Python 查找数组是否在2旁边包含2

Python 查找数组是否在2旁边包含2,python,debugging,Python,Debugging,我被这个问题难住了 给定一个整数数组,如果数组中某个地方的2旁边包含2,则返回True 我知道基本的想法(有语法错误),但我不能实现它。我也想知道这是什么类型的问题,例如,图形,搜索 def has22(nums): for x in nums: if ( (nums[x] = 2) and (nums[x+1] = 2) ) return True return False 我刚刚更正了你的代码。它在线性时间内运行,所以看不出有任何理由进一步研究它 下面是code

我被这个问题难住了

给定一个整数数组,如果数组中某个地方的2旁边包含2,则返回True

我知道基本的想法(有语法错误),但我不能实现它。我也想知道这是什么类型的问题,例如,图形,搜索

def has22(nums):
for x in nums:
    if ( (nums[x] = 2) and (nums[x+1] = 2) )
        return True

return False 
我刚刚更正了你的代码。它在线性时间内运行,所以看不出有任何理由进一步研究它

下面是codebunk上运行的代码

使用
enumerate()
获取索引和项,在列表上迭代只返回其元素,而不返回索引

def has22(lis):
    for i,x in enumerate(lis[:-1]):
       if x==2 and lis[i+1]==2:
           return True
    return False

>>> has22([1, 2, 2]) 
True
>>> has22([1, 2, 1, 2])
False
>>> has22([2, 1, 2])
False
您可以使用:

我会这样做:

def has22(l):
    return any(l[i]==2 and l[i+1]==2 for i in xrange(len(l)-1))
这使用了与其他答案类似的想法,但与生成器一起工作(在类似的情况下,这是首选)

在Python2中,如果您想要一个惰性的
zip

def has22(nums):
    it = iter(nums)
    return any(x == 2 == next(it, None) for x in it)

>>> has22([1, 2, 2])
True
>>> has22([1, 2, 1, 2])
False
>>> has22([2, 1, 2])
False
这使用了
index()
可能更快的思想,因为它不是用Python实现的。但我没有测量它

关于您的问题:您的代码在
for
循环init中没有使用
range()
。按照您的说法,
x
将不是索引,而是列表中的元素。而且它还受到使用
=
进行比较(实际上只是赋值)的影响。使用
==
进行比较

这不是一个图形问题,而是一个简单的搜索问题。对于(您实际做的事情)有非常好的解决方案(除了简单的解决方案之外)。

def has22(nums):
对于范围内的i(len(nums)-1):
如果nums[i:i+2]==[2,2]:
返回真值
返回False

def has22(nums):
    for i in range(len(nums) - 1):
        if nums[i] == 2 and nums[i + 1] == 2:
            return True
    return False
这是我想出的最简单的解决办法

使用for循环检查迭代数,
nums[i]==2
“和它旁边的那一个,
[i+1]==2


(len(nums)-1)
:这条线防止它通过for循环超出范围,因为最后一个循环上的
i+1
将检查出范围。

可能是最简单的解决方案:

    def has22(nums):
      if len(nums)==0:
        return False
      for i in range(len(nums)-1):
        #print nums[i:i+2]
        if nums[i:i+2]==[2,2]:
          return True
      return False
def has22(nums):
    return (2, 2) in zip(nums, nums[1:])

假设
nums==[1,2,2,3,4,5]
。然后,
nums[1::][2,2,3,4,5]
。该函数在被称为
zip(nums,nums[1:])
时,会将它们压缩为具有相同元组的迭代器,如下所示:

nums      =>  [1,      2,      2,      3,      4,      5]
nums[1:]  =>  [2,      2,      3,      4,      5]
zip()     =>  [(1, 2), (2, 2), (2, 3), (3, 4), (4, 5)]
而且应该很清楚[(1,2)、(2,2)、(2,3)、(3,4)、(4,5)]中的
(2,2)是如何正确的。这与zip中的
(2,2)的结果相同(nums,nums[1:])

仅使用索引

def has22(nums):
    return nums[nums.index(2)+1] == 2
def two_two(nums):
如果nums.count(2)=2:
返回真值
其他:
返回错误
def has22(nums):
对于范围(0,len(nums)-1)内的x:
如果nums[x]==2和nums[x+1]==2:
返回真值
返回错误
列表[1,2,2]->str'122'
'122'
中返回
'22'
,请尝试此操作

>>> ls = [1, 2, 2]
>>> s = str(ls)
>>> '2, 2' in s
>>> True


以下是我的作品:

def has22(nums): 对于范围(0,len(nums)-1)内的i: 如果nums[i:i+2]==[2,2] 返回真值 返回错误

此函数检查输入的每个2值块,以查看它是否包含
[2,2]

您有一个逻辑错误,因为您无法检查列表中的每个元素的一个元素和下一个元素是否都是2,因为最后一个元素没有下一个元素。不过,问题是什么还不清楚。你是在问如何修正你的语法吗?+1
zip
在这里,以重叠对进行迭代比任何基于索引操作的工具都要好。@Haidro你可以回答两次,这是一个完全不同的答案,所以我不想混淆那些没有投票支持它的人:)我知道,将它添加到你以前的文章中似乎是合理的one@Haidro无聊的,有些人可能不喜欢这个你永远不知道的,最好分开保存:p。但是你的选择是:)你为什么不写
x==2==next(它)
而使用
版本呢?不错,但有点难理解:与
zip()
和索引解决方案相比,理解这个解决方案的工作原理需要更多的时间(
是懒惰的,从左边计算,…)。注意:
pass
会更简单,因为这里的
中断更直接。@EOL我同意你的看法
zip()
似乎是最好的选择这就是
any()
的真正用途(参见A.R.S.的解决方案)。+1:清晰而简单。我仍然喜欢无索引的
zip()
版本,但这是紧随其后的第二个版本。请详细说明并改进此答案。虽然此代码片段可能会解决问题,但确实有助于提高您文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!虽然这段代码可能会回答这个问题,但提供关于这段代码为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。您好,欢迎来到StackOverflow。考虑包括代码的简短描述以及它如何解决发布的问题,以帮助其他人理解您的解决方案,而这可能会回答作者的问题,它缺少一些解释词和文档链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案。-1:无解释(见上述注释)、无效语法(如果<代码>中的缩进<代码>中的缩进<代码>中的缩进)、单向包含检查(
'2,2'在数字中<代码>而不是<代码>数字。计数('2,2')>=1
),以及过粗布尔检查(
以数字形式返回'2,2'
而不是
if
->
返回True
->
否则
->
返回False
)虽然此代码可以解决问题,但确实有助于提高p的质量
def has22(nums):
  
  
  for i in range(len(nums)-1):
    if nums[i] == 2 and nums[i+1] == 2:
      return True
  return False
def has22(nums):
    numbers = str(nums)
        if numbers.count('2, 2') >=1:
            return True
        else:
            return False
def has22(nums):
    return (2, 2) in zip(nums, nums[1:])
nums      =>  [1,      2,      2,      3,      4,      5]
nums[1:]  =>  [2,      2,      3,      4,      5]
zip()     =>  [(1, 2), (2, 2), (2, 3), (3, 4), (4, 5)]
def has_22(nums):
    desired = [2, 2]
    if str(desired)[1:-1] in str(nums):
        return True
    else:
        return False
    pass
def has22(nums):
    return nums[nums.index(2)+1] == 2
def has22(nums):
    return '22' in ''.join(map(str, nums))
>>> ls = [1, 2, 2]
>>> s = str(ls)
>>> '2, 2' in s
>>> True

def has22(nums):
  
  
  for i in range(len(nums)-1):
    if nums[i] == 2 and nums[i+1] == 2:
      return True
  return False