Créer une liste d'éléments uniques répétés n fois en Python
Éléments immuables
Pour les éléments immuables, comme Aucun, bools, ints, flotteurs, cordes, tuples ou frozensets, vous pouvez le faire comme ceci:
[e] * 4
Notez qu'il est préférable de l'utiliser uniquement avec des éléments immuables (chaînes, tuples, frozensets,) dans la liste, car ils pointent tous vers le même élément au même endroit en mémoire. Je l'utilise fréquemment lorsque je dois construire une table avec un schéma de toutes les chaînes, de sorte que je n'ai pas à donner un mappage un à un hautement redondant.
schema = ['string'] * len(columns)
Objets mutables
J'utilise Python depuis longtemps et je n'ai jamais vu de cas d'utilisation où je ferais ce qui précède avec une instance mutable. Au lieu de cela, pour obtenir, disons, une liste vide modifiable, un ensemble ou un dict, vous devez faire quelque chose comme ceci:
list_of_lists = [[] for _ in columns]
Le trait de soulignement est simplement un nom de variable jetable dans ce contexte.
Si vous n'avez que le numéro, ce serait:
list_of_lists = [[] for _ in range(4)]
Ce _
n'est pas vraiment spécial, mais votre vérificateur de style d'environnement de codage se plaindra probablement si vous n'avez pas l'intention d'utiliser la variable et d'utiliser un autre nom.
Avertissements pour l'utilisation de la méthode immuable avec des objets modifiables:
Méfiez-vous de faire cela avec des objets mutables , lorsque vous changez l'un d'eux, ils changent tous parce qu'ils sont tous le même objet:
foo = [[]] * 4
foo[0].append('x')
foo retourne maintenant:
[['x'], ['x'], ['x'], ['x']]
Mais avec des objets immuables, vous pouvez le faire fonctionner parce que vous changez la référence, pas l'objet:
>>> 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([])]
Mais encore une fois, les objets mutables ne sont pas bons pour cela, car les opérations sur place modifient l'objet, pas la référence:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]