Crie uma lista vazia em python com determinado tamanho

546

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ê?

Ronaldinho Aprenda Codificação
fonte
7
Uma "lista vazia" ( []) por definição possui zero elementos. O que você aparentemente quer é uma lista de valores Falsas como None, 0, ou ''.
dan04
Para gerar uma lista de 0para 9você, você deve realmente usar for i in range(0, 10), o que significa for (int i = 0, i < 10, i++).
Atcold 2/02

Respostas:

833

Você não pode atribuir a uma lista como lst[i] = something, a menos que a lista já esteja inicializada com pelo menos i+1elementos. 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:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

Atribuindo um valor a um elemento existente da lista acima:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

Lembre-se de que algo como l[15] = 5ainda falharia, pois nossa lista possui apenas 10 elementos.

o intervalo (x) cria uma lista de [0, 1, 2, ... x-1]

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Usando uma função para criar uma lista:

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Compreensão da lista (usando os quadrados porque, para o intervalo, você não precisa fazer tudo isso, basta retornar range(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
varunl
fonte
17
O que você quer dizer com "Você não pode atribuir a uma lista como lst [i] = algo" - é claro que pode! O que você não pode fazer é atribuir a um elemento inexistente além do comprimento lista atual
Sergey
5
"a menos que a lista já seja inicializada com pelo menos i + 1 elementos" ....
MrR 30/10/18
5
você pode fazer isso:a = [0 for _ in range(10)]
Kamiar
É possível fazer isso usando a função list ()?
Raul Chiarella
126

Tente isso:

lst = [None] * 10

O acima criará uma lista de tamanho 10, onde cada posição é inicializada None. Depois disso, você pode adicionar elementos a ele:

lst = [None] * 10
for i in range(10):
    lst[i] = i

É certo que essa não é a maneira pitônica de fazer as coisas. Melhor fazer isso:

lst = []
for i in range(10):
    lst.append(i)

Ou ainda mais simples , no Python 2.x, você pode fazer isso para inicializar uma lista com valores de 0 a 9:

lst = range(10)

E no Python 3.x:

lst = list(range(10))
Óscar López
fonte
2
A outra grande coisa sobre isso é que você pode inicializar uma lista com valores padrão. lst = [''] * 10oulst = [0] * 10
Anthony Manning-Franklin
2
Uma variante no exemplo de compreensão. Se todos os elementos da matriz necessidade de estar vazios na inicialização, utilizar: arr = [None for _ in range(10)].
Doug R.
86

resposta atualmente aceita de varunl

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

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:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

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.

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

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:

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]
James L.
fonte
19
Ouvi dizer que usar com appendmuita frequência é inferior às compreensões da lista. Você pode criar sua lista de listas via [ [] for _ in range(10)].
M.Herzkamp 4/08/16
10
Promovido o voto porque eu estava ficando bravo porque tinha uma matriz multidimensional com os mesmos dados repetidos várias vezes e não conseguia entender o que estava acontecendo antes de finalmente encontrar essa resposta. ^^ Não entendo por que é tão baixo aqui.
Bregalad
19

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.

Mohammed Hossain
fonte
16

Existem dois métodos "rápidos":

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

Parece que [None]*xé mais rápido:

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

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:

>>> timeit("range(100)",number=10000)
0.012513160705566406
mgoldwasser
fonte
Observe que no Python3 você terá que usá-lo list(range(n)), pois range()não retorna uma lista, mas é um iterador, e isso não é mais rápido que [None] * n.
Skillmon gosta de topanswers.xyz
10

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

x = [[] for i in range(10)]
Arco
fonte
7
A diferença mais importante entre fazer o que está acima e o fazer acima 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 a rangevariante baseada, pois ela cria 10 novos objetos. Eu achei essa distinção muito importante.
precisa saber é o seguinte
6

(Isso foi escrito com base na versão original da pergunta.)

Eu quero criar uma lista vazia (ou qualquer que seja a melhor maneira) pode conter 10 elementos.

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.

mas quando eu o executo, o resultado é []

print display s1não é uma sintaxe válida; com base na sua descrição do que você está vendo, suponho que você quis dizer display(s1)e então print s1. Para que isso seja executado, você deve ter definido anteriormente um globals1 para passar para a função.

A chamada displaynã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 e s1começar a nos referir a um recém-criadolist . Agora vamos modificar isso list" 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:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

O próximo problema que você notará é que sua lista terá apenas 9 elementos, porque o ponto final é ignorado pela rangefunção. (Como notas laterais, []funciona tão bem quanto list(), o ponto-e-vírgula é desnecessário, s1é um nome ruim para a variável e somente um parâmetro é necessário rangese você estiver começando 0.) Então você acaba com

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

No entanto, isso ainda está faltando a marca; rangenão é uma palavra-chave mágica que é parte da linguagem do caminho fore defsã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 para

def create_list():
    return range(10)

e agora você vê por que não precisamos escrever uma função; rangejá é a função que estamos procurando. Embora, novamente, não haja necessidade ou motivo para "pré-dimensionar" a lista.

Karl Knechtel
fonte
4

Uma maneira simples de criar uma matriz de tamanho 2D nusando compreensão de lista aninhada:

m = [[None for _ in range(n)] for _ in range(n)]
msonsona
fonte
3

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 listfunção:

list(range(9))
Igor Rodriguez
fonte
1
Um pouco curioso para saber por que alguém comenta sobre esse assunto ainda ... Eu sou um python noob e esse parece o caminho a seguir, mas ninguém diz nada. Talvez a função de alcance possa ser cara ou algo assim?
AFP_555 22/04/19
3
Esse problema é que esta resposta não cria uma lista vazia conforme a pergunta, você terminará com [0, 1, 2, 3, 4, 5, 6, 7, 8], que é o que a função range (9) faz . Assumir que instanciar uma lista de Nones é útil, em vez de preenchê-la com números imediatamente
Spcogg the second
Por que embrulhar o range(9)dentro list()? range(9)Já não retorna uma lista?
Zyl
2
@Zyl rangenão é uma lista, nem um gerador. É uma subclasse imutável interna de Sequence.
Nuno André
1
@ AFP_555 Acho que a verdadeira questão é por que não diminuiu mais o voto, já que realmente não responde à pergunta e pode ter consequências indesejadas.
eric
1

Aqui está o meu código para a lista 2D em python, que iria ler não. de linhas da entrada:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')
Amit Prafulla
fonte
0

A resposta aceita tem algumas dicas. Por exemplo:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

Portanto, cada dicionário se refere ao mesmo objeto. O mesmo vale se você inicializar com matrizes ou objetos.

Você poderia fazer isso:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 
user2233706
fonte
-2

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:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

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.

Sanjay Krishna
fonte
-2

Torne-o mais reutilizável como uma função.

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length
Kardi Teknomo
fonte
-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

Para criar uma lista, basta usar estes colchetes: "[]"

Para adicionar algo a uma lista, use list.append ()

Force Fighter
fonte
-3

Este código gera uma matriz que contém 10 números aleatórios.

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)
Akram Saeed
fonte
3
Bem-vindo ao SO. Sua resposta realmente não aborda a questão especificamente. Dê uma olhada em stackoverflow.com/help/how-to-answer #
Nick #