Estou tentando fazer uma lista com números 1-1000
. Obviamente, isso seria chato de escrever / ler, então estou tentando fazer uma lista com um intervalo. No Python 2, parece que:
some_list = range(1,1000)
teria funcionado, mas no Python 3 o intervalo é semelhante ao xrange
do Python 2?
Alguém pode fornecer algumas dicas sobre isso?
python
python-3.x
list
range
Boathouse
fonte
fonte
some_list[i] == i+1
você provavelmente não precisará de uma lista.Respostas:
Você pode apenas construir uma lista a partir do objeto range:
É assim que você faz isso com geradores em python2.x também. Normalmente, você provavelmente não precisa de uma lista, já que pode obter o valor de
my_list[i]
mais eficientemente (i + 1
) e, se precisar iterar, pode apenas voltar atrásrange
.Observe também que no python2.x,
xrange
ainda é indexável 1 . Isso significa querange
no python3.x também tem a mesma propriedade 21
print xrange(30)[12]
funciona para python2.x2 A declaração análoga a 1 no python3.x é
print(range(30)[12])
e também funciona.fonte
list(arg)
outras línguas, entende-se como chamar um construtor dalist
classe. Na verdade, também é o caso do Python. Os debates sobre se o objeto é preenchido durante a construção (como no caso de C ++) ou apenas durante o primeiro método chamado automaticamente (como no__init__()
método Python ) não podem alterar a idéia abstrata básica. Minha opinião é que o construtor da lista pega o iterador e preenche a lista com os valores retornados .'range' object is not callable
Em Pythons <= 3.4, você pode, como outros sugeriram, usar
list(range(10))
para criar uma lista fora de um intervalo (em geral, qualquer iterável).Outra alternativa, introduzida no Python
3.5
com suas generalizações de descompactação, é usando*
em uma lista literal[]
:Embora isso seja equivalente
list(r)
, é uma sintaxe literal e o fato de nenhuma chamada de função estar envolvida permite executar mais rapidamente. Também tem menos caracteres, se você precisar codificar golf :-)fonte
[*range(10)]
funciona bem quando você não precisa dorange
objetivo para qualquer finalidade, além de inicializar olist
. Nota lateral: Minha parte favorita (ok, na verdade não) das generalizações descompactadas é que osset
s vazios agora têm uma sintaxe literal{*()}
, ou, como eu chamo, o operador de macaco caolho. ;-)no Python 3.x, a
range()
função tem seu próprio tipo. portanto, neste caso, você deve usar o iteradorlist(range(1000))
fonte
list(range(1000))()
A razão pela qual o Python3 não possui uma função para obter diretamente uma lista variada é porque o designer original do Python3 era bastante novato no Python2. Ele considerou apenas o uso da
range()
função em um loop for, portanto, a lista nunca precisa ser expandida. De fato, muitas vezes precisamos usar arange()
função para produzir uma lista e passar para uma função.Portanto, nesse caso, o Python3 é menos conveniente quando comparado ao Python2, porque:
xrange()
erange()
;range()
elist(range())
No entanto, você ainda pode usar a expansão da lista desta maneira:
fonte
list
, porque geralmente é a coisa errada a fazer. Para 99 de 100 casos de uso, fazendo um reallist
é ineficiente e sem sentido, uma vez querange
em si funciona como uma seqüência imutável em quase todos os sentidos, às vezes de forma mais eficiente para boot (por exemplo contenção testes paraint
s sãoO(1)
, vs.O(n)
paralist
s). No Python 2, as pessoas costumavam usarrange
por padrão, emboraxrange
quase sempre fosse a melhor opção; no Python 3, você pode ativar explicitamente olist
, não obtê-lo por acidente usando o nome errado.Você realmente não precisa usar os números de 1 a 1000 em uma lista. Mas se, por algum motivo, você realmente precisar desses números, poderá:
Listar Compreensão em poucas palavras:
A compreensão da lista acima se traduz em:
Esta é apenas a sintaxe de compreensão da lista, embora a partir da 2.x. Eu sei que isso funcionará no python 3, mas não tenho certeza se também há uma sintaxe atualizada
O intervalo inicia inclusive o primeiro parâmetro; mas termina em Até, sem incluir o segundo parâmetro (quando fornecidos 2 parâmetros; se o primeiro parâmetro for deixado de fora, ele começará em '0')
fonte
list(range(1000))
list()
construtor com uma iterável . Olist()
construtor sabe como criar uma nova lista quando recebe qualquer objeto iterável.list(range(1000))
vai trabalhar em python3 assim comolist(xrange(1000))
em python2Na verdade, se você quiser 1-1000 (inclusive), use a
range(...)
função com os parâmetros 1 e 1001:,range(1, 1001)
porque arange(start, end)
função vai do início ao (final de 1), inclusive.fonte
Use o intervalo no Python 3.
Aqui está um exemplo de função que retorna entre números de dois números
fonte
De fato, esta é uma retro-graduação do Python3 em comparação com o Python2. Certamente, Python2, que usa range () e xrange (), é mais conveniente que Python3, que usa list (range ()) e range (), respectivamente. O motivo é que o designer original do Python3 não é muito experiente; eles consideraram o uso da função range por muitos iniciantes para iterar um grande número de elementos nos quais a memória e a CPU são ineficientes; mas negligenciaram o uso da função range para produzir uma lista de números. Agora, é tarde demais para eles voltarem.
Se eu fosse o designer do Python3, irei:
Isso deve ser o ideal.
fonte