Crea un elenco di singoli elementi ripetuti n volte in Python
Oggetti immutabili
Per oggetti immutabili, come Nessuno, bool, ints, float, stringhe, tuple o frozenset, puoi farlo in questo modo:
[e] * 4
Nota che questo è meglio usato solo con oggetti immutabili (stringhe, tuple, frozenset,) nell'elenco, perché puntano tutti allo stesso oggetto nello stesso posto in memoria. Lo uso frequentemente quando devo costruire una tabella con uno schema di tutte le stringhe, in modo da non doverne assegnare uno altamente ridondante a una mappatura.
schema = ['string'] * len(columns)
Oggetti mutabili
Ho usato Python per molto tempo e non ho mai visto un caso d'uso in cui farei quanto sopra con un'istanza mutabile. Invece, per ottenere, diciamo, una lista vuota mutevole, impostata o dettata, dovresti fare qualcosa del genere:
list_of_lists = [[] for _ in columns]
Il carattere di sottolineatura è semplicemente un nome variabile usa e getta in questo contesto.
Se hai solo il numero, sarebbe:
list_of_lists = [[] for _ in range(4)]
Non _
è davvero speciale, ma il tuo verificatore di stili di ambiente di codifica probabilmente si lamenterà se non intendi utilizzare la variabile e utilizzare un altro nome.
Avvertenze per l'utilizzo del metodo immutabile con oggetti mutabili:
Fai attenzione con oggetti mutabili , quando ne cambi uno, cambiano tutti perché sono tutti lo stesso oggetto:
foo = [[]] * 4
foo[0].append('x')
foo ora ritorna:
[['x'], ['x'], ['x'], ['x']]
Ma con oggetti immutabili, puoi farlo funzionare perché cambi il riferimento, non l'oggetto:
>>> l = [0] * 4
>>> l[0] += 1
>>> l
[1, 0, 0, 0]
>>> l = [frozenset()] * 4
>>> l[0] |= set('abc')
>>> l
[frozenset(['a', 'c', 'b']), frozenset([]), frozenset([]), frozenset([])]
Ma ancora una volta, gli oggetti mutabili non vanno bene per questo, perché le operazioni sul posto cambiano l'oggetto, non il riferimento:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]