Python - Buat daftar dengan angka antara 2 nilai?


356

Bagaimana saya membuat daftar dengan nilai di antara dua nilai yang saya masukkan? Misalnya, daftar berikut dihasilkan untuk nilai dari 11 hingga 16:

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

Jawaban:


644

Gunakan range. Dalam Python 2.x ia mengembalikan daftar sehingga yang Anda butuhkan adalah:

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

Dalam Python 3.x rangeadalah iterator. Jadi, Anda perlu mengubahnya menjadi daftar:

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

Catatan : Angka kedua adalah eksklusif. Jadi, di sini perlu 16+1=17

EDIT:

Untuk menanggapi pertanyaan tentang penambahan oleh 0.5, opsi termudah mungkin adalah menggunakan numpy arange() dan .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
Luar biasa! Persis apa yang saya cari! Apakah ada cara untuk meningkatkan dengan nilai yang lebih kecil seperti 0,5 dari hanya 1? jadi [11.0, 11.5, 12.0 ...... 16.0]
lorde

2
@ Lord Anda dapat bertambah lebih dari 1 dengan stepparameter ketiga tapi itu masih int - bukan float. Anda tidak dapat melakukannya dengan tepat di lib standar.
Jared

@ Jared dapatkah saya membuat daftar dengan menjatuhkan beberapa nilai setelah beberapa interval. seperti [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Baik untuk menceritakan tentang Python 2.x dan 3.x.
Sigur

Jika Anda bekerja dalam situasi di mana numpy tidak diinginkan, pertimbangkan (di mana x = 11, y = 17, dan langkah = 0,5 seperti di atas): a_range = [x] + [x + (langkah * i) untuk saya dalam rentang (int ((yx) / langkah))]
TheLoneDeranger

23

Anda sepertinya mencari 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]

Untuk menambah dengan 0.5alih-alih 1, katakan:

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

Hanya sedikit nitpick. Di blok kode pertama yang Anda gunakan listsebagai variabel.
Snakes and Coffee

2
Dalam python listadalah kelas builtin, jadi penggunaannya sebagai variabel agak tidak dianjurkan
Snakes and Coffee

x * kenaikan, tetapi apa yang Anda maksud dengan 2 * nilai awal, untuk apa? tolong jelaskan
Santosa Sandy

7

Mencoba:

range(x1,x2+1)  

Itu adalah daftar di Python 2.x dan berperilaku sebagian besar seperti daftar di Python 3.x. Jika Anda menjalankan Python 3 dan membutuhkan daftar yang dapat Anda modifikasi, maka gunakan:

list(range(x1,x2+1))

5

Jika Anda mencari rentang seperti fungsi yang bekerja untuk tipe float, maka di sini adalah artikel yang sangat bagus .

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

Keluaran:

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

Gunakan pemahaman daftar dalam python. Karena Anda ingin 16 dalam daftar juga .. Gunakan x2 +1. Fungsi rentang tidak termasuk batas yang lebih tinggi dalam fungsi.

list = [x untuk x dalam rentang (x1, x2 + 1)]


1
Jika Anda menggunakan range()tidak perlu menggunakan daftar pemahaman
Billal Begueradj

@BillalBegueradj Dalam Python3, range () mengembalikan objek seperti generator bukan daftar. Ini pada dasarnya sama dengan xrange () di Python 2. Anda benar bahwa pemahaman daftar tidak diperlukan. Fungsi builtin daftar () lebih mudah: list(range(x1, x2+1)).
Mike Housky

3

dengan asumsi Anda ingin memiliki kisaran antara x ke y

range(x,y+1)

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

gunakan daftar untuk dukungan 3.x


2

Dengan python Anda bisa melakukannya dengan sangat mudah

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

atau Anda dapat membuat fungsi rekursif yang mengembalikan array ke nomor yang diberikan:

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]


0

Cara paling elegan untuk melakukan ini adalah dengan menggunakan rangefungsi namun jika Anda ingin membuat kembali logika ini Anda dapat melakukan sesuatu seperti ini:

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

Ini menghasilkan output:

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

Seperti yang diungkapkan sebelumnya oleh @Jared, cara terbaik adalah menggunakan rangeatau numpy.arrangenamun saya menemukan kode yang menarik untuk dibagikan.


list (custom_range (10,3,1)) mengembalikan daftar kosong.
Denis Rasulev

memang, seperti [x for x in range(10, 3, 1)]- argumen pertama adalah awal, akhir kedua dan terakhir langkah. ==> stop> start
Michael

0

Setiap jawaban di atas menganggap kisaran hanya dari angka positif. Berikut adalah solusi untuk mengembalikan daftar angka berurutan di mana argumen dapat berupa (positif atau negatif), dengan kemungkinan untuk menetapkan nilai langkah opsional (default = 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

Misalnya, perintah standar list(range(1,-3))mengembalikan daftar kosong [], sementara fungsi ini akan kembali[-3,-2,-1,0,1]

Diperbarui : sekarang langkah mungkin negatif. Terima kasih @Michael atas komentarnya.


1
Ini mengasumsikan langkah Anda positif.
Michael

@Michael, poin bagus. Saya telah memperbarui kode, jadi sekarang Anda dapat memiliki langkah-langkah negatif :)
Denis Rasulev

@ tgikal, itu benar. Tetapi bagaimana jika Anda tidak tahu nilai-nilai apa yang akan ditetapkan untuk argumen fungsi Anda dan Anda perlu kembali diurutkan?
Denis Rasulev

Saya tidak melihat adanya fitur tambahan fungsi kustom Anda yang tidak dapat diselesaikan dengan menggunakan fungsi rentang builtin, saya kira contoh peningkatan akan sangat bagus, karena contoh Anda saat ini pada dasarnya i_min = -3, i_max = 1 any_number_range(i_max, i_min))kembali [-3,-2,-1,0,1] tetapi, builtin list(range(i_min, i_max + 1))akan mengembalikan nilai yang sama.
tgikal

Coba gunakan langkah negatif ketika urutan menurunlist(range(1,-3, -1))
Juan Antonio Roldán Díaz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.