2017-07-18 2 views
0

Désolé, c'est une question simple. Je suis nouveau à Python. J'essaye d'écrire une fonction qui détectera s'il y a 2 2 consécutifs l'un à côté de l'autre. nums est un tableau aléatoire de ints. Cependant, j'obtiens une erreur qui dit que la liste est hors de portée. Quelqu'un peut-il me dire pourquoi c'est? Merci!Vous essayez de rechercher des valeurs dans une liste Python mais obtenez une erreur de liste hors plage?

def has22(nums): 
for ii in nums: 
    if nums[ii]==2: 
     if ii+1 < len(nums): 
     if ii+1 == 2: 
      return True 
    return False 
+1

Si votre liste contient 5 éléments, mais que la valeur d'un de ces éléments est, par exemple, le nombre 9, alors 'nums [ii]' recherchera le 10ème élément de cette liste (10ème dû à zéro indexage). – roganjosh

+2

Note: 'ii' sera le nombre lui-même, pas l'index dans votre 'tableau'. –

+1

J'utiliserais une variante de la 2ème version de Kasramvd dans la question liée: 'any (i == j == 2 pour i, j dans zip (nums, nums [1:]))'. –

Répondre

0

Change:

for ii in nums: 

à

for ii in range(len(nums) - 1): 

et

if ii+1 == 2: 

à

if nums[ii+1] == 2: 
1

S'il vous plaît voir le commentaire ci-dessous

def has22(nums): 
    for i in range(len(nums)-1): # here we get the length of list - 1 
     if nums[i]==2 and nums[i+1]==2: # in this if condition, we check whether 2 consecutive 2 exist or not: yes ->return true 
      return True 
    return False # if no 2 consecutive 2 found in the list, return false 
1
def has22(nums): 
for ii in range(len(nums)): 
    if nums[ii]==2: 
     if ii+1 < len(nums): 
     if nums[ii+1] == 2: 
      return True 
return False 

Je recommande de faire quelque chose de plus élégant mais, comme celui-ci

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

Comme les commentateurs précédents ont souligné, ii est le nombre réel au lieu de l'index du nombre dans la liste. Par exemple, avec la liste nums = [3, 7, 4], la boucle utilise 3, 7 et 4 comme ii, et non 0, 1 et 2. Cela entraînerait une erreur car chacun de ces nombres est plus grand que l'index maximal.

Une façon de résoudre ce (sans doute plus élégant que les autres suggestions) consiste à utiliser enumerate()

def has22(nums): 
    for index, num in enumerate(nums): 
    if num==2: 
     if index+1 < len(nums): 
     if nums[index+1] == 2: 
      return True 
    return False 

enumerate() retourne un itérateur, qui, pour chaque élément renvoie un tuple contenant l'index de l'élément et l'article lui-même. Ainsi, index, num sont affectés à l'index du numéro dans la liste et au numéro lui-même, respectivement.

+0

Mais même alors, ces approches rappellent beaucoup les approches langagières naïves. Je crois que l'utilisation de regex pour chaque élément sera beaucoup mieux que d'utiliser MATCH, etc. – anugrah

+2

@anugrah Non! Utiliser regex pour cela est exagéré, et d'ailleurs, vous devez convertir les éléments de la liste en une chaîne pour utiliser regex, –