Eu quero criar uma lista vazia (ou qualquer que seja a melhor maneira) que possa conter 10 elementos.
Depois disso, quero atribuir valores nessa lista, por exemplo, isso deve exibir de 0 a 9:
s1 = list();
for i in range(0,9):
s1[i] = i
print s1
Mas quando executo esse código, ele gera um erro ou, em outro caso, apenas exibe []
(vazio).
Alguém pode explicar o porquê?
[]
) por definição possui zero elementos. O que você aparentemente quer é uma lista de valores Falsas comoNone
,0
, ou''
.0
para9
você, você deve realmente usarfor i in range(0, 10)
, o que significafor (int i = 0, i < 10, i++)
.Respostas:
Você não pode atribuir a uma lista como
lst[i] = something
, a menos que a lista já esteja inicializada com pelo menosi+1
elementos. Você precisa usar o acréscimo para adicionar elementos ao final da lista.lst.append(something)
.(Você pode usar a notação de atribuição se estiver usando um dicionário).
Criando uma lista vazia:
Atribuindo um valor a um elemento existente da lista acima:
Lembre-se de que algo como
l[15] = 5
ainda falharia, pois nossa lista possui apenas 10 elementos.o intervalo (x) cria uma lista de [0, 1, 2, ... x-1]
Usando uma função para criar uma lista:
Compreensão da lista (usando os quadrados porque, para o intervalo, você não precisa fazer tudo isso, basta retornar
range(0,9)
):fonte
a = [0 for _ in range(10)]
Tente isso:
O acima criará uma lista de tamanho 10, onde cada posição é inicializada
None
. Depois disso, você pode adicionar elementos a ele:É certo que essa não é a maneira pitônica de fazer as coisas. Melhor fazer isso:
Ou ainda mais simples , no Python 2.x, você pode fazer isso para inicializar uma lista com valores de 0 a 9:
E no Python 3.x:
fonte
lst = [''] * 10
oulst = [0] * 10
arr = [None for _ in range(10)]
.resposta atualmente aceita de varunl
Funciona bem para tipos sem referência, como números. Infelizmente, se você deseja criar uma lista de listas, encontrará erros de referência. Exemplo no Python 2.7.6:
Como você pode ver, cada elemento está apontando para o mesmo objeto de lista. Para contornar isso, você pode criar um método que inicialize cada posição em uma referência de objeto diferente.
Provavelmente, existe uma maneira python interna padrão de fazer isso (em vez de escrever uma função), mas não tenho certeza do que é. Ficaria feliz em ser corrigido!
Edit: É
[ [] for _ in range(10)]
Exemplo:
fonte
append
muita frequência é inferior às compreensões da lista. Você pode criar sua lista de listas via[ [] for _ in range(10)]
.Pode
.append(element)
à lista, por exemplo:s1.append(i)
. O que você está atualmente tentando fazer é acessar um elemento (s1[i]
) que não existe.fonte
Existem dois métodos "rápidos":
Parece que
[None]*x
é mais rápido:Mas se você estiver de acordo com um intervalo (por exemplo
[0,1,2,3,...,x-1]
),range(x)
poderá ser o mais rápido:fonte
list(range(n))
, poisrange()
não retorna uma lista, mas é um iterador, e isso não é mais rápido que[None] * n
.Estou surpreso que ninguém sugira essa abordagem simples para criar uma lista de listas vazias. Este é um tópico antigo, mas basta adicioná-lo para completar. Isso criará uma lista de 10 listas vazias
fonte
x = [[]] * 10
é que, no último, cada elemento da lista está apontando para o mesmo objeto da lista . Portanto, a menos que você queira apenas 10 cópias do mesmo objeto, use arange
variante baseada, pois ela cria 10 novos objetos. Eu achei essa distinção muito importante.(Isso foi escrito com base na versão original da pergunta.)
Todas as listas podem conter quantos elementos você quiser, sujeitos apenas ao limite de memória disponível. O único "tamanho" de uma lista que importa é o número de elementos atualmente nela.
print display s1
não é uma sintaxe válida; com base na sua descrição do que você está vendo, suponho que você quis dizerdisplay(s1)
e entãoprint s1
. Para que isso seja executado, você deve ter definido anteriormente um globals1
para passar para a função.A chamada
display
não modifica a lista pela qual você passa, conforme escrito. Seu código diz "s1
é um nome para qualquer coisa que foi passada para a função; ok, agora a primeira coisa que faremos é esquecer completamente essa coisa es1
começar a nos referir a um recém-criadolist
. Agora vamos modificar issolist
" Isso não afeta o valor que você passou.Não há razão para passar um valor aqui. (Também não há motivo real para criar uma função, mas isso não vem ao caso.) Você deseja "criar" algo, para que seja o resultado da sua função. Nenhuma informação é necessária para criar o que você descreve; portanto, não passe nenhuma informação. Para obter informações,
return
.Isso lhe daria algo como:
O próximo problema que você notará é que sua lista terá apenas 9 elementos, porque o ponto final é ignorado pela
range
função. (Como notas laterais,[]
funciona tão bem quantolist()
, o ponto-e-vírgula é desnecessário,s1
é um nome ruim para a variável e somente um parâmetro é necessáriorange
se você estiver começando0
.) Então você acaba comNo entanto, isso ainda está faltando a marca;
range
não é uma palavra-chave mágica que é parte da linguagem do caminhofor
edef
são, mas em vez disso é uma função. E adivinhe o que essa função retorna? Isso mesmo - uma lista desses números inteiros. Portanto, a função inteira entra em colapso parae agora você vê por que não precisamos escrever uma função;
range
já é a função que estamos procurando. Embora, novamente, não haja necessidade ou motivo para "pré-dimensionar" a lista.fonte
Uma maneira simples de criar uma matriz de tamanho 2D
n
usando compreensão de lista aninhada:fonte
Estou um pouco surpreso que a maneira mais fácil de criar uma lista inicializada não esteja em nenhuma dessas respostas. Basta usar um gerador na
list
função:fonte
range(9)
dentrolist()
?range(9)
Já não retorna uma lista?range
não é uma lista, nem um gerador. É uma subclasse imutável interna deSequence
.Aqui está o meu código para a lista 2D em python, que iria ler não. de linhas da entrada:
fonte
A resposta aceita tem algumas dicas. Por exemplo:
Portanto, cada dicionário se refere ao mesmo objeto. O mesmo vale se você inicializar com matrizes ou objetos.
Você poderia fazer isso:
fonte
Me deparei com essa pergunta SO enquanto procurava por um problema semelhante. Eu tive que construir uma matriz 2D e, em seguida, substituir alguns elementos de cada lista (na matriz 2D) por elementos de um ditado. Eu me deparei com essa questão do SO que me ajudou, talvez isso ajude outros iniciantes a se locomover. O truque principal era inicializar a matriz 2D como uma matriz numpy e depois usar em
array[i,j]
vez dearray[i][j]
.Para referência, este é o pedaço de código em que eu tive que usar isso:
Agora eu sei que podemos usar a compreensão de lista, mas por uma questão de simplicidade, estou usando um loop for aninhado. Espero que isso ajude outras pessoas que se deparam com este post.
fonte
Torne-o mais reutilizável como uma função.
fonte
Para criar uma lista, basta usar estes colchetes: "[]"
Para adicionar algo a uma lista, use list.append ()
fonte
Este código gera uma matriz que contém 10 números aleatórios.
fonte