Python - Utwórz listę z liczbami między 2 wartościami?


355

Jak utworzyć listę zawierającą wartości między dwiema wartościami, które wstawiłem? Na przykład generowana jest następująca lista dla wartości od 11 do 16:

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

Odpowiedzi:


643

Zastosowanie range. W Python 2.x zwraca listę, więc wszystko czego potrzebujesz to:

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

W Pythonie 3.x rangejest iteratorem. Musisz przekonwertować go na listę:

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

Uwaga : Drugi numer jest wyłączny. Więc tutaj musi być 16+1=17

EDYTOWAĆ:

Aby odpowiedzieć na pytanie o zwiększenie o 0.5, najłatwiejszą opcją byłoby prawdopodobnie użycie numpy arange() i .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
Niesamowite! Dokładnie tego szukałem! Czy istnieje również sposób na zwiększenie o mniejsze wartości, takie jak 0,5 niż tylko 1? więc [11,0, 11,5, 12,0 ...... 16,0]
lorde

2
@lorde Możesz zwiększyć o więcej niż 1 za pomocą trzeciego stepparametru, ale wciąż jest to int - not float. Nie możesz tego zrobić dokładnie w standardowej bibliotece lib.
Jared

@Jared mogę zrobić listę, upuszczając jakąś wartość po pewnym czasie. jak [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Dobry do opowiadania o Pythonie 2.xi 3.x.
Sigur

Jeśli pracujesz w okolicznościach, w których numpy jest niepożądany, rozważ (gdzie x = 11, y = 17 i krok = 0,5 jak wyżej): a_range = [x] + [x + (krok * i) dla i w zakresie (int ((yx) / step))]
TheLoneDeranger

23

Wygląda na to, że szukasz 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]

Aby zwiększyć o, 0.5zamiast 1, powiedz:

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

Drobny drodek. W pierwszym bloku kodu używasz listjako zmiennej.
Snakes and Coffee

2
W pythonie listjest wbudowana klasa, więc korzystanie z niej jako zmiennej jest nieco odradzane
Snakes and Coffee

x * przyrost, ale co rozumiesz przez 2 * wartość początkową, po co? czy mógłbyś wyjaśnić?
Santosa Sandy

7

Próbować:

range(x1,x2+1)  

To jest lista w Pythonie 2.x i zachowuje się jak lista w Pythonie 3.x. Jeśli używasz Python 3 i potrzebujesz listy, którą możesz zmodyfikować, użyj:

list(range(x1,x2+1))

5

Jeśli szukasz funkcji podobnej do zakresu, która działa dla typu float, to jest to bardzo dobry artykuł .

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

Wynik:

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

Używaj rozumienia listy w Pythonie. Ponieważ chcesz też 16 na liście .. Użyj x2 + 1. Funkcja zakresu wyklucza górną granicę funkcji.

list = [x dla xw zakresie (x1, x2 + 1)]


1
Jeśli range()nie potrzebujesz, użyj rozumienia listy
Billal Begueradj

@BillalBegueradj W Python3, range () zwraca obiekt podobny do generatora zamiast listy. Jest to w zasadzie to samo co xrange () w Pythonie 2. Masz rację, że zrozumienie listy nie jest potrzebne. Lista () funkcja wbudowana jest łatwiejsze: list(range(x1, x2+1)).
Mike Housky,

3

zakładając, że chcesz mieć zakres od x do y

range(x,y+1)

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

użyj listy do obsługi 3.x.


2

W Pythonie możesz to zrobić bardzo łatwo

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

lub możesz utworzyć funkcję rekurencyjną, która zwraca tablicę do podanej liczby:

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

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


0

Najbardziej eleganckim sposobem na to jest użycie tej rangefunkcji, jednak jeśli chcesz odtworzyć tę logikę, możesz zrobić coś takiego:

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

To daje wynik:

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

Wyrażone wcześniej przez @Jared, najlepszym sposobem jest użycie rangelub numpy.arrangejednak znajdę interesującą kod do podziału.


list (custom_range (10,3,1)) zwraca pustą listę.
Denis Rasulev

w rzeczy [x for x in range(10, 3, 1)]samej - pierwszy argument to początek, drugi koniec i ostatni krok. ==> stop> start
Michael

0

Każda powyższa odpowiedź zakłada, że ​​zakres ma wyłącznie liczby dodatnie. Oto rozwiązanie, aby zwrócić listę kolejnych liczb, w których argumentami mogą być dowolne (dodatnie lub ujemne), z możliwością ustawienia opcjonalnej wartości kroku (domyślnie = 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

Na przykład standardowe polecenie list(range(1,-3))zwraca pustą listę [], a funkcja ta powróci[-3,-2,-1,0,1]

Zaktualizowano : teraz krok może być ujemny. Dzięki @Michael za komentarz.


1
Zakłada to, że twój krok jest pozytywny.
Michael

@Michael, dobry punkt. Zaktualizowałem kod, więc teraz możesz mieć negatywne kroki :)
Denis Rasulev

@tgikal, zgadza się. Ale co, jeśli nie wiesz, jakie wartości zostaną przypisane argumentom funkcji i potrzebujesz posortowanego zwrotu?
Denis Rasulev

Nie widzę żadnych dodatkowych funkcji, które robi twoja funkcja niestandardowa, których nie można osiągnąć za pomocą wbudowanej funkcji zakresu. Myślę, że przykład ulepszenia byłby świetny, ponieważ twój obecny przykład w zasadzie i_min = -3, i_max = 1 any_number_range(i_max, i_min))zwraca, [-3,-2,-1,0,1] ale wbudowane list(range(i_min, i_max + 1))zwróci te same wartości.
tgikal

Spróbuj użyć kroku ujemnego, gdy sekwencja malejelist(range(1,-3, -1))
Juan Antonio Roldán Díaz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.