Python: aggiunge l'elemento all'elenco N volte


93

Questo sembra qualcosa per cui Python avrebbe una scorciatoia. Voglio aggiungere un elemento a un elenco N volte, in modo efficace facendo questo:

l = []
x = 0
for i in range(100):
    l.append(x)

Mi sembra che dovrebbe esserci un metodo "ottimizzato" per questo, qualcosa del tipo:

l.append_multiple(x, 100)

È lì?


9
l.extend([x] * 100)Ho finito per andare avanti perché si adattava meglio alla mia situazione. Amber ottiene il merito della risposta per essere la più completa. Grazie!
Toji

4
Assicurati di aver compreso la semantica di riferimento di Python prima di usarlo per qualcosa di non banale. Le x aggiunte ad l sono tutte le stesse x, quindi la modifica di una di esse le influenza tutte (tutte una, riferite a 100 volte).
Karl Knechtel

1
Per chiarimenti: lo sto usando per numeri interi, quindi il mio utilizzo è sicuro.
Toji

Risposte:


136

Per i tipi di dati non modificabili:

l = [0] * 100
# [0, 0, 0, 0, 0, ...]

l = ['foo'] * 100
# ['foo', 'foo', 'foo', 'foo', ...]

Per i valori memorizzati per riferimento e che potresti voler modificare in seguito (come sotto-elenchi o dict):

l = [{} for x in range(100)]

(Il motivo per cui il primo metodo è solo una buona idea per valori costanti, come int o stringhe, è perché solo una copia superficiale viene eseguita quando si utilizza la <list>*<number>sintassi, e quindi se si facesse qualcosa di simile [{}]*100, si finirebbero con 100 riferimenti allo stesso dizionario, quindi cambiarne uno cambierebbe tutti. Dato che int e stringhe sono immutabili, questo non è un problema per loro.)

Se si desidera aggiungere a un elenco esistente, è possibile utilizzare il extend()metodo di tale elenco (in combinazione con la generazione di un elenco di cose da aggiungere tramite le tecniche precedenti):

a = [1,2,3]
b = [4,5,6]
a.extend(b)
# a is now [1,2,3,4,5,6]

2
Oppure combina entrambi i suggerimenti nella forma di a.extend(b*n)dove nsono le volte in cui vuoi ripetere gli elementi in b
DarkCygnus

26

Usa estendi per aggiungere una comprensione dell'elenco alla fine.

l.extend([x for i in range(100)])

Vedere la documentazione di Python per ulteriori informazioni.


6

Itertools repeat combinato con list extended.

from itertools import repeat
l = []
l.extend(repeat(x, 100))

6

Ho dovuto prendere un'altra strada per un incarico, ma questo è ciò che ho ottenuto.

my_array += ([x] * repeated_times)

3

Potresti farlo con una comprensione delle liste

l = [x for i in range(10)];

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.