6

我被困在这个问题上

给定一个整数数组,如果该数组在某处的某个 2 旁边包含一个 2,则返回 True。

has22([1, 2, 2]) → True
has22([1, 2, 1, 2]) → False
has22([2, 1, 2]) → False

我知道基本思想(存在语法错误),但我无法实现。我也想知道这是什么类型的问题,例如。图表,搜索?

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

return False 
4

20 回答 20

9
def has22(nums):
    return any(x == y == 2 for x, y in zip(nums, nums[1:]))

>>> has22([1, 2, 2])
True
>>> has22([1, 2, 1, 2])
False
>>> has22([2, 1, 2])
False

在 Python 2 中使用:from itertools import izip如果你想要一个懒惰的zip

于 2013-05-29T11:59:54.007 回答
6

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

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()函数,当调用 as 时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)]

并且应该清楚如何(2, 2) in [(1, 2), (2, 2), (2, 3), (3, 4), (4, 5)]是真的。这与 的结果相同(2, 2) in zip(nums, nums[1:])

于 2018-12-22T23:53:09.080 回答
4
def has22(nums):
    for x in range(len(nums)-1):
        if (nums[x] == 2) and (nums[x+1] == 2):
            return True
    return False

我刚刚更正了您的代码。它以线性时间运行,因此没有任何理由进一步研究它。

这是codebunk上的运行代码。http://codebunk.com/bunk#-Ivk7Xw2blX3cIWavI17

于 2013-05-29T11:48:37.947 回答
1

您可以使用iter()

>>> def has22(lst):
...     lst = iter(lst)
...     for i in lst:
...             try:
...                 if i == 2 and lst.next() == 2:
...                     return True
...             except StopIteration:
...                     pass
...     return False
... 
>>> has22([1, 2, 2])
True
>>> has22([1, 2, 1, 2])
False
>>> has22([2, 1, 2])
False
于 2013-05-29T11:51:21.727 回答
1
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
于 2013-05-29T12:22:57.557 回答
1
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最后一个循环将检查超出范围。

于 2018-03-27T11:45:56.693 回答
1
def has22(nums):
    return '22' in ''.join(map(str, nums))

列表 [1, 2 , 2] -> str '122'
返回'22''122'

于 2020-05-23T07:21:05.420 回答
0

我会这样做:

def has22(l):
    return any(l[i]==2 and l[i+1]==2 for i in xrange(len(l)-1))

这使用了与其他答案类似的想法,但与生成器一起使用(在这种情况下是首选)。

于 2013-05-29T11:52:44.467 回答
0
def has22(lst):
  pos = 0 
  while True:
    try:
      next = lst.index(2, pos) + 1
    except ValueError:
      return False
    if next == pos + 1:
      return True
    pos = next    

index()这使用了由于不是在 Python 中实现而可能更快的想法。不过没量过。

range()关于您的问题:您的代码因未在for循环初始化中使用而受到影响。你把它的方式,x不是索引,而是列表的元素。而且它也受到使用=比较的影响(实际上只是分配)。用于==比较。

这不是图形问题,而是一个简单的搜索问题。有相当不错strstr的解决方案(除了直接的解决方案)可以在字符串中查找字符串(您实际执行的操作)。

于 2013-05-29T12:59:08.183 回答
0

用于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
于 2013-05-29T11:48:49.123 回答
0

尝试这个

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

于 2020-05-23T07:35:07.697 回答
0

以下对我有用:

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

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

于 2020-11-12T15:58:06.007 回答
0

只使用索引

def has22(nums):
    return nums[nums.index(2)+1] == 2
于 2020-03-01T12:05:06.543 回答
0
    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
于 2018-04-01T08:26:00.280 回答
0
def two_two(nums):
  if nums.count(2)==2:
    return True
  else:
    return False
于 2020-03-14T17:25:38.693 回答
0

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

于 2017-01-05T23:47:44.960 回答
0
def has_22(nums):
    desired = [2, 2]
    if str(desired)[1:-1] in str(nums):
        return True
    else:
        return False
    pass
于 2019-05-24T15:32:37.813 回答
0
def has22(nums):
  
  
  for i in range(len(nums)-1):
    if nums[i] == 2 and nums[i+1] == 2:
      return True
  return False
于 2021-05-01T08:11:15.810 回答
-1
def has22(nums):
    for x in range(0, len(nums)-1):
        if nums[x] == 2 and nums[x+1] == 2:
            return True

    return False
于 2020-05-09T12:39:50.597 回答
-1
def has22(nums):
    numbers = str(nums)
        if numbers.count('2, 2') >=1:
            return True
        else:
            return False
于 2018-09-27T23:48:46.763 回答