Знайсці, калі масіў змяшчае 2 побач з 2

Я затрымаўся на гэтую праблему

<�Р> Улічваючы масіў цэлых лікаў, вярнуць Ісціна, калі масіў змяшчае 2 побач з 2 недзе.
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
У вас ёсць трохі лагічнай памылкі ў тым, што вы не можаце праверыць, ці з'яўляецца элемент, а наступны элемент з'яўляюцца як 2 для кожнага элемента ў спісе, таму што апошні элемент не мае наступны элемент. Няясна, што пытанне тут, хоць. Вы пытаецеся, як выправіць сінтаксіс?
дададзена аўтар geoffspear, крыніца

10 адказы

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

In Python 2 use: from itertools import izip if you want a lazy zip

8
дададзена
+1. <�Код> зашпілька-маланка для перабору ў перакрываюцца пар з'яўляецца лепшым інструментам тут, чым што-небудзь на аснове маніпуляцый азначніка.
дададзена аўтар lvc, крыніца
def has22(nums):
    for x in range(len(nums)-1):
        if (nums[x] == 2) and (nums[x+1] == 2):
            return True
    return False

Я толькі выпраўлены код. Яна працуе ў лінейным часу, так што не бачу ніякіх прычын, каб працаваць над ім далей.

Here is the running code on codebunk. http://codebunk.com/bunk#-Ivk7Xw2blX3cIWavI17

5
дададзена
Гэта сапраўды тое, што любой() для (гл рашэнне па А. Р. С.).
дададзена аўтар EOL, крыніца

Вы можаце выкарыстоўваць 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
1
дададзена
Не дрэнна, але трохі цяжка чытаць: гэта займае больш часу, каб зразумець, як працуе гэта рашэнне ( і гультаяваты і ацэньвае злева, ...), у параўнанні з паштовага індэкса() і індэксны рашэння. Заўвага: перадаць будзе прасцей, так як больш прамой залому тут.
дададзена аўтар EOL, крыніца
@EOL Я згодны з вамі. <�Код> зашпілька-маланка() , здаецца, лепш за ўсё выкарыстоўваць
дададзена аўтар TerryA, крыніца

Я хацеў бы зрабіць гэта:

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

Гэта выкарыстоўвае падобную ідэю, як і іншыя адказы, але працуе з генератарам (як было б пераважней ў тых выпадках, як гэта).

1
дададзена
+1: Ясная і простая. Я па-ранейшаму аддаю перавагу індэкс менш зашпілька-маланка() версіі, але гэта прыходзіць як другое месца.
дададзена аўтар EOL, крыніца
def has22(nums):
    it = iter(nums)
    return any(x == 2 == next(it) for x in it)

>>> has22([1, 2, 2])
True
>>> has22([1, 2, 1, 2])
False
>>> has22([2, 1, 2])
False
1
дададзена
Я ведаю, што гэта толькі здаецца разумным, каб дадаць яго на папярэдняй
дададзена аўтар TerryA, крыніца
Па-дурному: р. Але вы выбар :)
дададзена аўтар TerryA, крыніца
Адказаў у два разы?
дададзена аўтар TerryA, крыніца
@Haidro Вам дазваляецца двойчы адказаць, гэта зусім іншы адказ, так што я не хачу змешваць людзей, якія не галасавалі за яго :)
дададзена аўтар jamylak, крыніца
@Haidro Мех, некаторыя людзі не могуць, як гэта той, які вы ніколі не ведаеце, лепш захоўваць асобна
дададзена аўтар jamylak, крыніца
@Haidro я заўважыў нешта дзіўнае ад стварэння гэтага размесцяць як пытанне прама цяпер
дададзена аўтар jamylak, крыніца
@Alfe добрая ідэя
дададзена аўтар jamylak, крыніца
Любая прычына, чаму вы не проста напісаць х == 2 == наступны (гэта) і выкарыстоўваць і Версія замест гэтага?
дададзена аўтар Alfe, крыніца

Выкарыстоўвайце пералічэння() , каб атрымаць як індэкс, а таксама пункта, ітэрацыя спіс толькі вяртае яго элементы не індэксуе.

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
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    

Гэта выкарыстоўвае ідэю, што індэкс() можа быць хутчэй, дзякуючы рэалізуецца не ў Python. Нельга ні вымераць, хоць.

Што тычыцца вашага пытання: Ваш код пакутуе не выкарыстоўваючы дыяпазон() у для завесы ініцыялізацыі. То, як вы выказаліся, х не будзе індэксаў, але элементы спісу. І ён таксама пакутуе ад выкарыстання = для параўнання (які на самай справе проста прысваенне). Выкарыстоўвайце == для параўнання.

Гэта не праблема, граф, гэта просты пошук пытанне. Ёсць даволі вытанчаная strstr Рашэнні (акрамя прамой наперад адзін) для пошук радкі ў радкі (тое, што вы на самай справе).

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
0
дададзена
У той час як гэты код можа адказаць на пытанне, забяспечваючы дадатковы кантэкст адносна таго, чаму і/або, як гэты код адказвае на пытанне паляпшае доўгатэрміновую каштоўнасць.
дададзена аўтар rollstuhlfahrer, крыніца
def has22(nums):   
    for i in range(len(nums)-1):
    if nums[i] == 2 and nums[i+1] == 2:
      return True   
return False

Гэта было самым простым рашэннем, якое я прыдумаў.

Выкарыстанне для цыклу, каб праверыць, калі ітэрацыя нумар НУМС [я] == 2 «і» адзін побач з ім == 2 , праверыўшы становішча наперадзе выкарыстоўваючы [I + 1] .

(len(nums)-1) this line prevents it from going out of the range through the for loop as the i+1 on the final loop will check out of the range.

0
дададзена

<�Код> Абарона has22 (НУМС):   инт ў дыяпазоне (LEN (НУМС) -1):     калі НУМС [я: я + 2] == [2,2]:       вяртаюць   вяртаць False

0
дададзена
У той час як гэты фрагмент кода можа вырашыць пытанне, уключаючы тлумачэнне сапраўды дапамагае палепшыць якасць ваш пост. Памятаеце, што вы адказваеце на пытанне, для чытачоў у будучыні, і гэтыя людзі могуць не ведаць прычыны вашага кода прапановы. Калі ласка, паспрабуйце не тоўпяцца код з тлумачальнымі каментарамі, гэта зніжае чытальнасць як коды і тлумачэнні!
дададзена аўтар Filnor, крыніца
Просьба ўдакладніць і палепшыць гэты адказ.
дададзена аўтар ppovoski, крыніца