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.
4 respuestas
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
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
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))
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
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.