Criar lista de itens únicos repetidos n vezes em Python
Itens imutáveis
Para itens imutáveis, como None, bools, ints, floats, strings, tuplas ou frozensets, você pode fazer o seguinte:
[e] * 4
Observe que isso é melhor usado apenas com itens imutáveis (cadeias de caracteres, tuplas, conjuntos de frozens) na lista, porque todos apontam para o mesmo item no mesmo local na memória. Uso isso frequentemente quando tenho que construir uma tabela com um esquema de todas as strings, para não precisar fornecer um mapeamento altamente redundante para um.
schema = ['string'] * len(columns)
Itens mutáveis
Eu uso o Python há muito tempo e nunca vi um caso de uso em que faria isso acima com uma instância mutável. Em vez disso, para obter, digamos, uma lista vazia mutável, definir ou ditar, você deve fazer algo assim:
list_of_lists = [[] for _ in columns]
O sublinhado é simplesmente um nome de variável descartável nesse contexto.
Se você tiver apenas o número, seria:
list_of_lists = [[] for _ in range(4)]
A _
não é realmente especial, mas o verificador de estilo ambiente de codificação provavelmente vai reclamar se você não pretende usar a variável e usar qualquer outro nome.
Advertências para o uso do método imutável com itens mutáveis:
Cuidado ao fazer isso com objetos mutáveis , quando você altera um deles, todos eles mudam porque são todos o mesmo objeto:
foo = [[]] * 4
foo[0].append('x')
foo agora retorna:
[['x'], ['x'], ['x'], ['x']]
Mas com objetos imutáveis, você pode fazê-lo funcionar porque altera a referência, não o objeto:
>>> 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([])]
Mas, novamente, objetos mutáveis não são bons para isso, porque as operações no local alteram o objeto, não a referência:
l = [set()] * 4
>>> l[0] |= set('abc')
>>> l
[set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b']), set(['a', 'c', 'b'])]