Python - Створити список із числами між 2 значеннями?


355

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

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

Відповіді:


643

Використовуйте 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]
lorde

2
@lorde Ви можете збільшити більше ніж 1 за допомогою третього stepпараметра, але це все-таки int - не плавати. Ви не можете зробити це саме в стандартному режимі.
Джаред

@Jared Я можу скласти список, скинувши якесь значення через деякий інтервал. подобається [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, а крок = 0,5, як вище): a_range = [x] + [x + (крок * 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

приріст х *, але що ви маєте на увазі під початковим значенням 2 *, для чого? ви поясніть, будь ласка?
Сантоза Санді

7

Спробуйте:

range(x1,x2+1)  

Це список у Python 2.x і веде себе здебільшого як список у Python 3.x. Якщо ви використовуєте Python 3 і вам потрібен список, який ви можете змінити, тоді використовуйте:

list(range(x1,x2+1))

5

Якщо ви шукаєте функцію типу діапазону, яка працює для плаваючого типу, то ось дуже гарна стаття .

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

припускаючи, що ви хочете мати діапазон між x до y

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]

Як висловив раніше @Jred, найкращим способом є використання 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
Це передбачає, що ваш крок позитивний.
Майкл

@Michael, хороший момент. Я оновив код, тож тепер у вас можуть бути негативні кроки :)
Денис Расулєв,

@tgikal, саме так. Але що робити, якщо ви не знаєте, які значення будуть присвоєні аргументам вашої функції, і вам потрібно сортувати повернення?
Денис Расулєв

Я не бачу додаткових функцій, які виконує ваша власна функція, які неможливо виконати за допомогою функції вбудованого діапазону, я думаю, що приклад удосконалення був би чудовим, оскільки ваш поточний приклад в основному 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))поверне ті самі значення.
tgikal

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