¿Cómo agregar un número entero a cada elemento en una lista?

135

Si tengo list=[1,2,3]y quiero agregar 1a cada elemento para obtener la salida [2,3,4], ¿cómo lo haría?

Supongo que usaría un bucle for pero no estoy seguro exactamente cómo.

Dennis
fuente

Respuestas:

157
new_list = [x+1 for x in my_list]
Ned Batchelder
fuente
66
Esta charla lo explica: Datos y mitos sobre los nombres y valores de Python: nedbatchelder.com/text/names1.html
Ned Batchelder
√ Información impresionante. Apertura de ojos.
Daniel Springer, el
3
@DaniSpringer Porque no está asignando a una lista. Es lo mismo que hacer lst = [1, 2, 3]; e = lst[0]; e += 1. eno tiene ninguna información sobre de dónde vino, es solo una variable a la que se ha asignado un elemento de una lista. Después de asignarle algo más, la lista lstno cambiará.
Błażej Michalik
Bueno, esta respuesta me parece muy similar.
Daniel Springer el
y el corresponsal perezoso calculó uno:new_list = (x+1 for x in my_list)
Eduardo Pignatelli
24

Las otras respuestas en la comprensión de la lista son probablemente la mejor opción para la suma simple, pero si tiene una función más compleja que necesitaba aplicar a todos los elementos, entonces el mapa puede ser una buena opción.

En su ejemplo sería:

>>> map(lambda x:x+1, [1,2,3])
[2,3,4]
Andrew Cox
fuente
77
map(1 .__add__, ...)también funciona Tenga en cuenta que necesita un espacio entre 1y .para evitar que el analizador piense que es un flotador
John La Rooy
15

si quieres usar numpy hay otro método de la siguiente manera

import numpy as np
list1 = [1,2,3]
list1 = list(np.asarray(list1) + 1)
sushmit
fuente
13

Editar: esto no está en su lugar

En primer lugar, no use la palabra 'lista' para su variable. Sombra la palabra clave list.

La mejor manera es hacerlo en el lugar mediante empalme, tenga en cuenta que [:]denota un empalme:

>>> _list=[1,2,3]
>>> _list[:]=[i+1 for i in _list]
>>> _list
[2, 3, 4]
robert king
fuente
44
Esto es bueno para cambiar la lista existente, pero aún produce una nueva. ¿De alguna manera no es seguro usar un generador para evitar la creación innecesaria de listas? Es decir, _list[:]=(i+1 for i in _list).
Alan
eso todavía crea una nueva lista, no es posible hacerlo en el lugar sin un bucle for, no creo
robert king
¿Por qué crees que _list[:]=(i+1 for i in _list)crea una nueva lista?
Alan
Quiero decir, está en su lugar, pero temporalmente creará una lista completamente nueva para los rhs. Vea estas respuestas: stackoverflow.com/questions/4948293/… stackoverflow.com/questions/11877212/…
robert king
Veo a que te refieres. Llamar a la secuencia temporal una lista me confundió. ¿Sabemos realmente algo sobre su tipo? ¿No sería eso una implementación específica?
Alan
9
>>> [x.__add__(1) for x in [1, 3, 5]]
3: [2, 4, 6]

Mi intención aquí es exponer si el elemento en la lista es un entero que admite varias funciones integradas.

Kracekumar
fuente
7

Python 2+:

>>> mylist = [1,2,3]
>>> map(lambda x: x + 1, mylist)
[2, 3, 4]

Python 3+:

>>> mylist = [1,2,3]
>>> list(map(lambda x: x + 1, mylist))
[2, 3, 4]
satomacoto
fuente
3
import numpy as np

np.add([1, 2, 3], 1).tolist()

lo que da

[2, 3, 4]
Mark Jay
fuente
2

Encontré una forma no tan eficiente, pero única de hacerlo. Por lo tanto, compartirlo. Y sí, requiere espacio adicional para otra lista.

from operator import add
test_list1 = [4, 5, 6, 2, 10]
test_list2 = [1] * len(test_list1)

res_list = list(map(add, test_list1, test_list2))

print(test_list1)
print(test_list2)
print(res_list)

#### Output ####
[4, 5, 6, 2, 10]
[1, 1, 1, 1, 1]
[5, 6, 7, 3, 11]
Preetham
fuente
¿De dónde viene "agregar"?
hahnec
add debería importar de los operadores,from operator import add
Rajith Thennakoon
0
list = [1,2,3,4,5]

for index in range(5):
      list[index] = list[index] +1

print(list)
Munchjax
fuente
0

Muchas de las respuestas anteriores son muy buenas. También he visto algunas respuestas extrañas que harán el trabajo. Además, la última respuesta vista fue a través de un bucle normal. Esta disposición a dar respuestas me lleva a itertoolsy numpy, que hará el mismo trabajo de una manera diferente.

Aquí presento diferentes formas de hacer el trabajo, no respondidas anteriormente.

import operator
import itertools

x = [3, 5, 6, 7]

integer = 89

"""
Want more vairaint can also use zip_longest from itertools instead just zip
"""
#lazy eval
a = itertools.starmap(operator.add, zip(x, [89] * len(x))) # this is not subscriptable but iterable
print(a)
for i in a:
  print(i, end = ",")


# prepared list
a = list(itertools.starmap(operator.add, zip(x, [89] * len(x)))) # this returns list
print(a)



# With numpy (before this, install numpy if not present with `pip install numpy`)
import numpy

res = numpy.ones(len(x), dtype=int) * integer + x # it returns numpy array
res = numpy.array(x) + integer # you can also use this, infact there are many ways to play around
print(res)
print(res.shape) # prints structure of array, i.e. shape

# if you specifically want a list, then use tolist

res_list = res.tolist()
print(res_list)

Salida

>>> <itertools.starmap object at 0x0000028793490AF0> # output by lazy val
>>> 92,94,95,96,                                     # output of iterating above starmap object
>>> [92, 94, 95, 96]                                 # output obtained by casting to list
>>>                   __
>>> # |\ | |  | |\/| |__| \ /
>>> # | \| |__| |  | |     |
>>> [92 94 95 96]                                    # this is numpy.ndarray object
>>> (4,)                                             # shape of array
>>> [92, 94, 95, 96]                                 # this is a list object (doesn't have a shape)

Mi única razón para resaltar el uso de numpyes que uno siempre debe hacer tales manipulaciones con bibliotecas como numpy porque es eficiente en el rendimiento para matrices muy grandes.

Rushikesh
fuente