Como adicionar um número inteiro a cada elemento de uma lista?


135

Se eu tenho list=[1,2,3]e quero adicionar 1a cada elemento para obter a saída [2,3,4], como eu faria isso?

Presumo que usaria um loop for, mas não sei exatamente como.

Respostas:


157
new_list = [x+1 for x in my_list]

6
Esta palestra explica: Fatos e Mitos sobre Python Nomes e Valores: nedbatchelder.com/text/names1.html
Ned Batchelder

√ Informação impressionante. Olhos abertos.
Daniel Springer

3
@DaniSpringer Porque você não está atribuindo a uma lista. É o mesmo que fazer lst = [1, 2, 3]; e = lst[0]; e += 1. enão possui nenhuma informação sobre a origem, é apenas uma variável à qual um elemento de uma lista foi atribuído. Depois de atribuir algo a ele, a lista lstnão será alterada.
Błażej Michalik

Bem, esta resposta é muito parecida comigo.
Daniel Springer

e o correspondente preguiçoso calculou um:new_list = (x+1 for x in my_list)
Eduardo Pignatelli 14/09


24

As outras respostas na compreensão da lista são provavelmente a melhor aposta para uma adição simples, mas se você tiver uma função mais complexa que precisa aplicar a todos os elementos, o mapa poderá ser uma boa opção.

No seu exemplo, seria:

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

7
map(1 .__add__, ...)funciona também Note que você precisa de um espaço entre 1e .para impedir que o pensamento analisador é um float
John La Rooy

15

se você quiser usar numpy, existe outro método, como a seguir

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

13

Editar: este não está no local

Em primeiro lugar, não use a palavra 'lista' para sua variável. Sombreia a palavra-chavelist .

A melhor maneira é fazê-lo no lugar usando emendas; observe que [:]denota uma emenda:

>>> _list=[1,2,3]
>>> _list[:]=[i+1 for i in _list]
>>> _list
[2, 3, 4]

4
Isso é bom para alterar a lista existente, mas ainda produz uma nova. De alguma forma, é inseguro usar um gerador para evitar a criação desnecessária de listas? Ou seja _list[:]=(i+1 for i in _list),.
2077 Alan

que ainda cria uma nova lista, não é possível fazê-lo no local sem um loop for, eu não acho
robert king

Por que você acha que _list[:]=(i+1 for i in _list)cria uma nova lista?
Alan

Quero dizer, está no lugar, mas temporariamente ele criará uma lista totalmente nova para o rhs. Veja estas respostas: stackoverflow.com/questions/4948293/… stackoverflow.com/questions/11877212/…
robert king

Eu vejo o que você quer dizer. Chamar a sequência temporária de lista me confundiu. Realmente sabemos alguma coisa sobre esse tipo? Isso não seria específico da implementação?
Alan

9
>>> [x.__add__(1) for x in [1, 3, 5]]
3: [2, 4, 6]

Minha intenção aqui é expor se o item na lista é um número inteiro que suporta várias funções internas.


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]

3
import numpy as np

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

que dá

[2, 3, 4]

2

Me deparei com uma maneira não tão eficiente, mas única de fazê-lo. Então, compartilhe-o. Sim, ele exige espaço extra para outra 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]

de onde vem "adicionar"?
hahnec

adicionar deve importar de 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)

0

Muitas das respostas acima são muito boas. Eu também vi algumas respostas estranhas que farão o trabalho. Além disso, a última resposta vista foi através de um loop normal. Esta vontade de dar respostas me leva a itertoolse numpy, o que irá fazer o mesmo trabalho de uma maneira diferente.

Aqui apresento maneiras diferentes de fazer o trabalho, não respondidas acima.

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)

Resultado

>>> <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)

Meu único motivo para destacar o uso de numpyé que sempre devemos fazer essas manipulações com bibliotecas como numpy, pois é eficiente em termos de desempenho para matrizes muito grandes.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.