Python - Criar lista com números entre 2 valores?

356

Como criar uma lista com valores entre dois valores inseridos? Por exemplo, a seguinte lista é gerada para valores de 11 a 16:

list = [11, 12, 13, 14, 15, 16]
lorde
fonte

Respostas:

644

Use range. No Python 2.x, ele retorna uma lista, então tudo que você precisa é:

>>> range(11, 17)
[11, 12, 13, 14, 15, 16]

No Python 3.x rangeé um iterador. Então, você precisa convertê-lo em uma lista:

>>> list(range(11, 17))
[11, 12, 13, 14, 15, 16]

Nota : O segundo número é exclusivo. Então, aqui precisa ser 16+1=17

EDITAR:

Para responder à pergunta sobre incrementar por 0.5, a opção mais fácil provavelmente seria usar o numpy arange() e .tolist():

>>> import numpy as np
>>> np.arange(11, 17, 0.5).tolist()

[11.0, 11.5, 12.0, 12.5, 13.0, 13.5,
 14.0, 14.5, 15.0, 15.5, 16.0, 16.5]
Jared
fonte
11
Impressionante! Exatamente o que eu estava procurando! Existe também uma maneira de incrementar valores menores, como 0,5, do que apenas 1? so [11.0, 11.5, 12.0 ...... 16.0]
lorde 16/08
2
@lorde Você pode aumentar em mais de 1 com um terceiro stepparâmetro, mas isso ainda é um int - não flutuante. Você não pode fazer isso exatamente na biblioteca padrão.
Jared
@ Jared, posso fazer uma lista soltando algum valor após algum intervalo. like [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]
2
É bom para contar sobre o Python 2.xe 3.x.
Sigur
Se você estiver trabalhando em circunstâncias em que numpy é indesejável, considere (onde x = 11, y = 17 e etapa = 0,5 conforme acima): a_range = [x] + [x + (etapa * i) para i no intervalo (int ((yx) / step))]
TheLoneDeranger
23

Você parece estar procurando range():

>>> x1=11
>>> x2=16
>>> range(x1, x2+1)
[11, 12, 13, 14, 15, 16]
>>> list1 = range(x1, x2+1)
>>> list1
[11, 12, 13, 14, 15, 16]

Para incrementar em 0.5vez de 1, diga:

>>> list2 = [x*0.5 for x in range(2*x1, 2*x2+1)]
>>> list2
[11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5, 16.0]
devnull
fonte
Apenas um pequeno detalhe. No primeiro bloco de código você usa listcomo uma variável.
Snakes and Coffee
2
Em python listé uma classe embutido, então seu uso como uma variável é um pouco desanimado
Snakes and Coffee
x * incremento, mas o que você quer dizer com 2 * valor inicial, para que? você explicaria por favor?
Santosa Sandy
7

Tentar:

range(x1,x2+1)  

Essa é uma lista no Python 2.xe se comporta principalmente como uma lista no Python 3.x. Se você estiver executando o Python 3 e precisar de uma lista que possa modificar, use:

list(range(x1,x2+1))
Mike Housky
fonte
5

Se você está procurando uma função de faixa que funciona para o tipo float, aqui está um artigo muito bom .

def frange(start, stop, step=1.0):
    ''' "range()" like function which accept float type''' 
    i = start
    while i < stop:
        yield i
        i += step
# Generate one element at a time.
# Preferred when you don't need all generated elements at the same time. 
# This will save memory.
for i in frange(1.0, 2.0, 0.5):
    print i   # Use generated element.
# Generate all elements at once.
# Preferred when generated list ought to be small.
print list(frange(1.0, 10.0, 0.5))    

Resultado:

1.0
1.5
[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5]
Rajesh Surana
fonte
3

Use a compreensão da lista em python. Como você também quer 16 na lista .. Use x2 + 1. A função Range exclui o limite mais alto na função.

lista = [x para x no intervalo (x1, x2 + 1)]

Bhargav Ponnapalli
fonte
11
Se você usar range()sem necessidade de usar uma compreensão de lista
Billal Begueradj
@BillalBegueradj No Python3, range () retorna um objeto do tipo gerador em vez de uma lista. É basicamente o mesmo que xrange () no Python 2. Você está certo que a compreensão da lista não é necessária. A função interna list () é mais fácil: list(range(x1, x2+1)).
Mike Housky 19/01
3

supondo que você queira ter um intervalo entre x e y

range(x,y+1)

>>> range(11,17)
[11, 12, 13, 14, 15, 16]
>>>

lista de uso para suporte 3.x

v2b
fonte
2

Em python, você pode fazer isso muito avidamente

start=0
end=10
arr=list(range(start,end+1))
output: arr=[0,1,2,3,4,5,6,7,8,9,10]

ou você pode criar uma função recursiva que retorna uma matriz até um determinado número:

ar=[]
def diff(start,end):
    if start==end:
        d.append(end)
        return ar
    else:
        ar.append(end)
        return diff(start-1,end) 

output: ar = [10,9,8,7,6,5,4,3,2,1,0]

ashutosh pandey
fonte
0

A maneira mais elegante de fazer isso é usando a rangefunção; no entanto, se você deseja recriar essa lógica, pode fazer algo assim:

def custom_range(*args):
    s = slice(*args)
    start, stop, step = s.start, s.stop, s.step
    if 0 == step:
        raise ValueError("range() arg 3 must not be zero")
    i = start
    while i < stop if step > 0 else i > stop:
        yield i
        i += step

>>> [x for x in custom_range(10, 3, -1)]

Isso produz a saída:

[10, 9, 8, 7, 6, 5, 4]

Conforme expresso anteriormente por @Jared, a melhor maneira é usar o rangeou, numpy.arrangeno entanto, acho o código interessante para ser compartilhado.

Michael
fonte
list (custom_range (10,3,1)) retorna uma lista vazia.
Denis Rasulev 11/01/19
de fato, como [x for x in range(10, 3, 1)]- o primeiro argumento é o começo, o segundo o fim e o último o passo. ==> stop> start
Michael
0

Todas as respostas acima assumem que o intervalo é apenas de números positivos. Aqui está a solução para retornar a lista de números consecutivos em que os argumentos podem ser quaisquer (positivos ou negativos), com a possibilidade de definir o valor opcional da etapa (padrão = 1).

def any_number_range(a,b,s=1):
""" Generate consecutive values list between two numbers with optional step (default=1)."""
if (a == b):
    return a
else:
    mx = max(a,b)
    mn = min(a,b)
    result = []
    # inclusive upper limit. If not needed, delete '+1' in the line below
    while(mn < mx + 1):
        # if step is positive we go from min to max
        if s > 0:
            result.append(mn)
            mn += s
        # if step is negative we go from max to min
        if s < 0:
            result.append(mx)
            mx += s
    return result

Por exemplo, o comando padrão list(range(1,-3))retorna a lista vazia [], enquanto esta função retorna[-3,-2,-1,0,1]

Atualizado : agora a etapa pode ser negativa. Obrigado @ Michael pelo seu comentário.

Denis Rasulev
fonte
11
Isso pressupõe que seu passo seja positivo.
Michael
@ Michael, bom ponto. Eu atualizei o código, então agora você pode ter passos negativos :)
Denis Rasulev
@ tgikal, está certo. Mas e se você não souber quais valores serão atribuídos aos argumentos de sua função e precisar de retorno ordenado?
Denis Rasulev 6/09/18
Eu não vejo nenhum recurso adicional que sua função personalizada faça que não possa ser realizada usando a função de intervalo embutida. Acho que um exemplo de melhoria seria ótimo, pois seu exemplo atual é basicamente i_min = -3, i_max = 1 any_number_range(i_max, i_min))retornado. [-3,-2,-1,0,1] Mas, builtin list(range(i_min, i_max + 1))retornará os mesmos valores.
tgikal 6/09/19
Tente usar um passo negativo quando a sequência estiver diminuindolist(range(1,-3, -1))
Juan Antonio Roldán Díaz