Tengo una lista de números como [1,2,3,4,5...]
, y quiero calcular (1+2)/2
y para el segundo, (2+3)/2
y el tercero
(3+4)/2
, y así sucesivamente. ¿Cómo puedo hacer eso?
Me gustaría sumar el primer número con el segundo y dividirlo por 2, luego sumar el segundo con el tercero y dividir por 2, y así sucesivamente.
Además, ¿cómo puedo sumar una lista de números?
a = [1, 2, 3, 4, 5, ...]
Lo es:
b = sum(a)
print b
para obtener un número?
Esto no funciona para mi.
Respuestas:
Pregunta 1: Entonces desea (elemento 0 + elemento 1) / 2, (elemento 1 + elemento 2) / 2, ... etc.
Hacemos dos listas: una de cada elemento, excepto el primero, y una de cada elemento, excepto el último. Entonces, los promedios que queremos son los promedios de cada par tomado de las dos listas. Usamos
zip
tomar pares de dos listas.Supongo que desea ver decimales en el resultado, a pesar de que sus valores de entrada son enteros. Por defecto, Python realiza la división de enteros: descarta el resto. Para dividir las cosas por completo, necesitamos usar números de punto flotante. Afortunadamente, dividir un int por un float producirá un float, por lo que solo usamos
2.0
para nuestro divisor en lugar de2
.Así:
Pregunta 2:
Ese uso de
sum
debería funcionar bien. Los siguientes trabajos:Además, no necesita asignar todo a una variable en cada paso del camino.
print sum(a)
funciona bienTendrás que ser más específico sobre exactamente lo que escribiste y cómo no está funcionando.
fuente
my_list
solo se define si lo define. Se suponía que era un marcador de posición para lo que llamaras la lista con la que intentas trabajar. No puedo adivinar cómo lo llamaste.a
".zip
detiene una vez que llega al final del argumento más corto,zip(my_list, my_list[1:])
es suficiente.Suma lista de números:
Calculando la mitad de n y n - 1 (si tengo el patrón correcto), usando una lista de comprensión :
Suma elementos adyacentes, por ejemplo ((1 + 2) / 2) + ((2 + 3) / 2) + ... usando reduce y lambdas
fuente
x
yx - 1
; podríamos restar 0.5 en su lugar.from functools import reduce
Pregunta 2: Para resumir una lista de enteros:
Si la lista contiene enteros como cadenas:
fuente
sum(i for i in a)
es redundantesum(Decimal(i) for i in a)
=>sum(int(i) for i in a)
osum(map(int,a))
Puedes probar de esta manera:
fuente
a[0:len(a)]
crea una copia dea
, ¿cuál es el punto además de desperdiciar CPU y memoria? luegoprint(sm)
también funciona en python 2. No entiendo por qué esto tiene tantos votos a mediados de 2017 ... pero se aplica a la mayoría de las respuestas aquí.Parece que
sum
se ha definido en algún lugar del código y sobrescribe la función predeterminada. Así que lo eliminé y el problema se resolvió.fuente
Usando un simple
list-comprehension
y elsum
:fuente
[
y]
, simplemente puede pasar la expresión del generadorsum(i/2. for i in range(x))
sum(range(x)) / 2.
evita todas las divisiones, solo divide al final.Todas las respuestas mostraron un enfoque programático y general. Sugiero un enfoque matemático específico para su caso. Puede ser más rápido en particular para listas largas. Funciona porque su lista es una lista de números naturales hasta
n
:Supongamos que tenemos los números naturales
1, 2, 3, ..., 10
:Puede usar la
sum
función en una lista:También puede usar la fórmula
n*(n+1)/2
donden
está el valor del último elemento de la lista (aquínat_seq[-1]
:), para evitar iterar sobre los elementos:Para generar la secuencia
(1+2)/2, (2+3)/2, ..., (9+10)/2
, puede usar un generador y la fórmula(2*k-1)/2.
(observe el punto para convertir los valores en puntos flotantes). Debe omitir el primer elemento al generar la nueva lista:Aquí también, puede usar la
sum
función en esa lista:Pero también puede usar la fórmula
(((n*2+1)/2)**2-1)/2
, por lo que puede evitar iterar sobre los elementos:fuente
La forma más sencilla de resolver este problema:
fuente
Esta pregunta ha sido respondida aquí
fuente
fuente
Los generadores son una manera fácil de escribir esto:
fuente
Hagamos que sea fácil para principiantes: -
global
palabra clave permitirá que se asigne el mensaje de variable global dentro de la función principal sin producir una nueva variable localEste concepto se llama Sombreado
Salidas = 15
fuente
Usando la
pairwise
receta itertools :fuente
Corto y simple:
Y así es como se ve:
Debido a alguna estupidez en la forma en Python maneja una
map
más de dos listas, usted tiene que truncar la lista,a[:-1]
. Funciona más de lo que cabría esperar si usaitertools.imap
:fuente
Tantas soluciones, pero aún falta mi favorita:
una matriz numpy no es muy diferente de una lista (en este caso de uso), excepto que puede tratar las matrices como números:
¡Hecho!
explicación
Los índices elegantes significan esto:
[1:]
incluye todos los elementos desde 1 hasta el final (omitiendo así el elemento 0), y[:-1]
son todos los elementos excepto el último:Entonces, agregar esos dos le da una matriz que consta de elementos (1 + 2), (2 + 3) y así sucesivamente. No es que esté dividiendo por
2.0
, no2
porque, de lo contrario, Python cree que solo está usando enteros y produce resultados enteros redondeados.ventaja de usar numpy
Numpy puede ser mucho más rápido que los bucles alrededor de las listas de números. Dependiendo de cuán grande sea su lista, varios órdenes de magnitud más rápido. Además, es mucho menos código y, al menos para mí, es más fácil de leer. Estoy tratando de hacer un hábito el uso de numpy para todos los grupos de números, y es una gran mejora para todos los bucles y bucles dentro de bucles que de otro modo habría tenido que hacer.
fuente
Solo usaría una lambda con map ()
fuente
Yo uso un
while
bucle para obtener el resultado:fuente
Recorra los elementos de la lista y actualice el total de esta manera:
fuente
Gracias a Karl Knechtel pude entender tu pregunta. Mi interpretación:
Primera pregunta usando la función anónima (también conocida como función Lambda):
Segunda pregunta que también usa la función anónima (también conocida como función Lambda):
Ambas preguntas se combinaron en una sola línea de código:
use el que mejor se adapte a sus necesidades
fuente
También puede hacer lo mismo usando recursividad:
Fragmento de Python:
fuente
Intenta usar una lista de comprensión. Algo como:
fuente
range(len(old_list) - 1)
), pero los Pythonistas generalmente desaprueban la combinación de 'rango' y 'len'. Un corolario de "solo debería haber una forma de hacerlo" es "la biblioteca estándar proporciona una manera de evitar cosas feas". La iteración indirecta - iterar sobre una secuencia de números, para que pueda usar esos números para indexar lo que realmente desea iterar - es algo feo.En el espíritu de itertools. Inspiración de la receta por parejas.
Ejemplos:
fuente
fuente
Una manera simple es usar la permutación iter_tools
El resultado es:
Tenga en cuenta que el orden es importante, es decir, 1, 2, 7 también se muestra como 2, 1, 7 y 7, 1, 2. Puede reducir esto utilizando un conjunto.
fuente
En Python 3.8, se puede usar el nuevo operador de asignación
a
es una referencia en ejecución al valor anterior en la lista, por lo tanto, se inicializa al primer elemento de la lista y la iteración se produce en el resto de la lista, actualizándosea
después de que se utiliza en cada iteración.Se usa un iterador explícito para evitar la necesidad de crear una copia de la lista usando
my_list[1:]
.fuente
Intenta lo siguiente:
fuente
sum
función no difiere delsum
comportamiento o nombre incorporado . En realidad, podría eliminar la definición de función de su respuesta y aún funcionaría.sum
. Obtendría una A en un examen por responder la pregunta correctamente, pero las respuestas de StackOverflow también deben ser útiles para las personas que llegan a esta página, y las respuestas duplicadas no lo son.