Python - Создать список с номерами между 2 значениями?


356

Как мне создать список со значениями между двумя значениями, которые я вставил? Например, следующий список генерируется для значений от 11 до 16:

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

Ответы:


644

Использование range. В Python 2.x он возвращает список, поэтому все, что вам нужно, это:

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

В Python 3.x rangeесть итератор. Итак, вам нужно преобразовать его в список:

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

Примечание : второй номер является эксклюзивным. Итак, здесь это должно быть 16+1=17

РЕДАКТИРОВАТЬ:

Чтобы ответить на вопрос об увеличении на 0.5, проще всего было бы использовать numpy arange() и .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]

1
Потрясающие! Именно то, что я искал! Есть ли способ увеличить на меньшие значения, такие как 0,5, чем просто 1? поэтому [11,0, 11,5, 12,0 ...... 16,0]
13

2
@lorde Вы можете увеличить более чем на 1 с третьим stepпараметром, но это все еще int, а не float. Вы не можете сделать это точно в стандартной библиотеке.
Джаред

@ Джаред я могу составить список, сбросив некоторое значение через некоторый интервал. как [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Хорошо рассказать о Python 2.x и 3.x.
Сигур

Если вы работаете в условиях, когда numpy нежелателен, подумайте (где x = 11, y = 17 и step = 0.5, как указано выше): a_range = [x] + [x + (step * i) для i в диапазоне (int ((yx) / step))]
TheLoneDeranger

23

Вы, кажется, ищете 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]

Для увеличения 0.5вместо 1, скажем:

>>> 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]

Просто мелкий придира. В первом блоке кода вы используете listв качестве переменной.
Змеи и кофе

2
В Python listесть встроенный класс, поэтому его использование в качестве переменной несколько не рекомендуется
Snakes and Coffee

x * инкремент, но что вы подразумеваете под 2 * startvalue, для чего? не могли бы вы объяснить, пожалуйста?
Santosa Sandy

7

Пытаться:

range(x1,x2+1)  

Это список в Python 2.x и ведет себя в основном как список в Python 3.x. Если вы работаете с Python 3 и вам нужен список, который вы можете изменить, используйте:

list(range(x1,x2+1))

5

Если вы ищете функцию типа range, которая работает для типа float, то вот очень хорошая статья .

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))    

Вывод:

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]

3

Используйте понимание списка в Python. Поскольку вы тоже хотите 16 в списке .. Используйте x2 + 1. Функция диапазона исключает верхний предел в функции.

list = [x для x в диапазоне (x1, x2 + 1)]


1
Если вам range()не нужно использовать списки
Billal Begueradj

@BillalBegueradj В Python3 range () возвращает генераторный объект вместо списка. По сути, это то же самое, что и xrange () в Python 2. Вы правы, что понимание списка не нужно. Функция встроенного списка () проще: list(range(x1, x2+1)).
Майк Хаски

3

при условии, что вы хотите иметь диапазон от х до у

range(x,y+1)

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

используйте список для поддержки 3.x


2

В Python вы можете сделать это очень легко

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

или вы можете создать рекурсивную функцию, которая возвращает массив до заданного числа:

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

вывод: ar = [10,9,8,7,6,5,4,3,2,1,0]


0

Самый элегантный способ сделать это с помощью range функцию, однако, если вы хотите воссоздать эту логику, вы можете сделать что-то вроде этого:

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)]

Это производит вывод:

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

Как уже было сказано @Jared, лучшим способом является использование кода rangeили, как numpy.arrangeмне кажется, интересного для совместного использования.


list (custom_range (10,3,1)) возвращает пустой список.
Денис Расулев

действительно, как [x for x in range(10, 3, 1)]- первый аргумент - начало, второй конец и последний шаг. ==> Стоп> начать
Майкл

0

Каждый ответ выше предполагает, что диапазон только положительных чисел. Вот решение для возврата списка последовательных чисел, где аргументы могут быть любыми (положительными или отрицательными), с возможностью установить необязательное значение шага (по умолчанию = 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

Например, стандартная команда list(range(1,-3))возвращает пустой список [], а эта функция возвращает[-3,-2,-1,0,1]

Обновлено : теперь шаг может быть отрицательным. Спасибо @Michael за его комментарий.


1
Это предполагает, что ваш шаг положительный.
Майкл

@ Майкл, хорошая мысль. Я обновил код, так что теперь у вас могут быть отрицательные шаги :)
Денис Расулев

@tgikal, это верно. Но что, если вы не знаете, какие значения будут назначены аргументам вашей функции, и вам нужно отсортировать return?
Денис Расулев

Я не вижу каких-либо дополнительных функций, которые ваша пользовательская функция выполняет, которые не могут быть реализованы с помощью встроенной функции range, я думаю, что пример улучшения был бы великолепен, поскольку ваш текущий пример в основном i_min = -3, i_max = 1 any_number_range(i_max, i_min))возвращает [-3,-2,-1,0,1] Но встроенная функция list(range(i_min, i_max + 1))будет возвращать те же значения.
августа

Попробуйте использовать отрицательный шаг, когда последовательность уменьшаетсяlist(range(1,-3, -1))
Хуан Антонио Рольдан Диас
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.