Come aggiungere un numero intero a ciascun elemento in un elenco?


135

Se ho list=[1,2,3]e voglio aggiungere 1ad ogni elemento per ottenere l'output [2,3,4], come lo farei?

Presumo che userei un ciclo for ma non so esattamente come.

Risposte:


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

6
Questo discorso lo spiega: Fatti e miti su nomi e valori di Python: nedbatchelder.com/text/names1.html
Ned Batchelder

√ Informazioni fantastiche. Aprire gli occhi.
Daniel Springer,

3
@DaniSpringer Perché non stai assegnando a un elenco. È lo stesso che fare lst = [1, 2, 3]; e = lst[0]; e += 1. enon ha alcuna informazione sulla sua provenienza, è solo una variabile a cui è stato assegnato un elemento di un elenco. Dopo avergli assegnato qualcos'altro, l'elenco lstnon cambierà.
Błażej Michalik,

Bene, questa risposta è molto simile a me.
Daniel Springer,

e il corrispondente pigro ne calcolò uno:new_list = (x+1 for x in my_list)
Eduardo Pignatelli,


24

Le altre risposte sulla comprensione dell'elenco sono probabilmente la soluzione migliore per una semplice aggiunta, ma se hai una funzione più complessa che devi applicare a tutti gli elementi, allora la mappa potrebbe essere una buona scelta.

Nel tuo esempio sarebbe:

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

7
map(1 .__add__, ...)funziona anche. Si noti che è necessario uno spazio tra 1e .per impedire al parser di pensare che sia un galleggiante
John La Rooy,

15

se vuoi usare numpy c'è un altro metodo come segue

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

13

Modifica: questo non è sul posto

Innanzitutto non utilizzare la parola "elenco" per la tua variabile. Ombreggia la parola chiave list.

Il modo migliore è farlo sul posto usando la giunzione, nota che [:]denota una giunzione:

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

4
Questo è utile per modificare l'elenco esistente, ma ne produce ancora uno nuovo. È in qualche modo pericoloso utilizzare un generatore per evitare la creazione di elenchi non necessari? Vale a dire, _list[:]=(i+1 for i in _list).
Alan,

che crea ancora un nuovo elenco, non è possibile farlo sul posto senza un ciclo for non credo
robert king

Perché pensi che _list[:]=(i+1 for i in _list)crei un nuovo elenco?
Alan,

Voglio dire, è a posto, ma temporaneamente creerà un elenco completamente nuovo per rhs. Vedi queste risposte: stackoverflow.com/questions/4948293/… stackoverflow.com/questions/11877212/…
robert king

Capisco cosa vuoi dire. Chiamare la sequenza temporanea un elenco mi ha confuso. Sappiamo davvero qualcosa del suo tipo? Non sarebbe specifico per l'implementazione?
Alan,

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

La mia intenzione qui è esporre se l'elemento nell'elenco è un numero intero che supporta varie funzioni integrate.


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

che dà

[2, 3, 4]

2

È venuto attraverso un modo non così efficiente, ma unico per farlo. Quindi condividilo attraverso. E sì, richiede spazio extra per un altro elenco.

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]

da dove viene "aggiungi"?
hahnec,

aggiungere dovrebbe importare dagli operatori,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

Molte delle risposte sopra sono molto buone. Ho anche visto alcune risposte strane che faranno il lavoro. Inoltre, l'ultima risposta vista è stata attraverso un normale ciclo. Questa volontà di dare risposte mi porta a , itertoolse numpyche farà lo stesso lavoro in modo diverso.

Qui presento diversi modi per fare il lavoro, senza risposta sopra.

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)

Produzione

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

La mia unica ragione per evidenziare l'uso di numpyè che si dovrebbero sempre fare tali manipolazioni con librerie come numpy perché è efficiente in termini di prestazioni per array molto grandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.