Soy muy nuevo en Python y he estado revisando varios tutoriales para mejorar.

Me he quedado con un problema difícil y he encontrado una solución. Pero se siente, funciona como un novato. Creo que lo he adaptado para responder a la pregunta específica.

Así que la pregunta es:

VERANO DE '69: Devuelve la suma de los números en la matriz, excepto que ignora las secciones de números que comienzan con un 6 y se extienden hasta los siguientes 9 (cada 6 irá seguido de al menos un 9). Devuelve 0 sin números.

summer_69([1, 3, 5]) --> 9
summer_69([4, 5, 6, 7, 8, 9]) --> 9
summer_69([2, 1, 6, 9, 11]) --> 14

Mi código para resolver esto es:

def summer_69(arr):
    list1 = arr
    summ = int()
    for i in range(0, len(arr)):
        if 6 in list1:
            listOfRange = range(list1.index(6), list1.index(9) + 1)
            for index in listOfRange:
                    print(listOfRange)
                    arr[index] = 0
            if 6 != arr[i]:
                summ += arr[i]
            else:
                continue
        else:
            summ += arr[i]
    return summ

Es un problema muy básico y estoy muy alerta de que ya he luchado con algo como esto.

1
Klim Yadrintsev 10 oct. 2019 a las 17:27

4 respuestas

La mejor respuesta

Considere un enfoque diferente para usar las herramientas de Python para simplificar la tarea.

Haga una copia de la lista para poder modificar la copia. No modificará los elementos, por lo que una copia superficial será suficiente.

Verifique si hay un 6 en la lista, y si es así, use index para encontrar el primer índice de 6, luego el índice de los primeros 9 después del índice de 6.

Luego elimine el segmento (en la copia de la lista) que corresponde a ese rango.

Luego, cuando no haya más 6s, puede usar sum para resumir todo lo que queda en la lista y devolver el resultado.

La parte de corte es la parte más complicada y se ve así:

# pretend we already used index to get these 

indexof6 = 4 
indexofnext9 = 10
del copyoflist[indexof6:indexof9+1]

En total podría verse así:

def summer_69(lst):
    copyoflist = lst[:] # makes shallow copy of list
    while True:
        if 6 not in copyoflist:
            return sum(copyoflist)

        indexof6 = copyoflist.index(6)
        indexof9 = copyoflist.index(9, indexof6+1) # begin search for 9 after 6
        del copyoflist[indexof6:indexof9+1] 
>>> summer_69([1,2,6,3,2,12,1234,9,3,6,345,6,6,9,2])
8
>>> summer_69([1,2,3])
6
1
Ruzihm 11 oct. 2019 a las 19:16

Algo como esto:

def summer_69(lst):
  """Return the sum of the numbers in the array, 
     except ignore sections of numbers starting with a 6 and extending to the next 9 
     (every 6 will be followed by at least one 9). Return 0 for no numbers
  """
  if not lst:
    return 0
  else:
    _sum = 0
    active = True
    for x in lst:
      if active: 
        if x != 6:
          _sum += x
        else:
          active = False
      else:
        if x == 9:
          active = True
    return _sum

print(summer_69([1, 3, 5]))
print(summer_69([4, 5, 6, 7, 8, 9]))
print(summer_69([2, 1, 6, 9, 11]))

Salida

9
9
14
0
balderman 10 oct. 2019 a las 14:46

Aquí hay una versión que usa un idioma pitónico más reutilizable, una función de generador, y es un poco más compacto (al costo leve de una comparación adicional):

def yield_non_summer(series):
  in_summer = False
  def stateful_summer_predicate(v):
    nonlocal in_summer
    if in_summer and v == 9:
      in_summer = False
      return True  # 9 is still in summer
    elif not in_summer and v == 6:
      in_summer = True
    return in_summer
  return (v for v in series if not stateful_summer_predicate(v))

def summer_69(series):
  return sum(yield_non_summer(series))

O, en menos líneas:

def yield_non_summer(series):
  in_summer = False
  def stateful_summer_predicate(v):
    nonlocal in_summer
    in_summer = (in_summer or v == 6) and v != 9
    return in_summer
  return (v for v in series if not stateful_summer_predicate(v))

def summer_69(series):
  return sum(yield_non_summer(series))
1
Ruzihm 11 oct. 2019 a las 15:44

Así es como lo haría, como primer corte:

def summer_69(series):
  in_summer = False
  cur_sum = 0
  for v in series:
    if in_summer:
      if v == 9:
        in_summer = False
    else:
      if v == 6:
        in_summer = True
      else:
        cur_sum += v
  return cur_sum
0
Sean Suchter 10 oct. 2019 a las 14:34
58325254