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.