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 - ไม่ลอย คุณไม่สามารถทำเช่นนั้นได้ใน lib มาตรฐาน
จาเร็ด

@ Jared ฉันสามารถสร้างรายการโดยการลดค่าหลังจากช่วงเวลาหนึ่ง เช่น [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
เหมาะสำหรับบอกเกี่ยวกับ Python 2.x และ 3.x
Sigur

หากคุณกำลังทำงานในสถานการณ์ที่ไม่ต้องการจำนวน numpy ให้พิจารณา (โดยที่ x = 11, y = 17 และขั้นตอน = 0.5 ข้างต้น): a_range = [x] + [x + (ขั้นตอน * i) สำหรับ i ในช่วง (int ((yx) / ขั้นตอน))]
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
ในไพ ธ อนlistเป็นคลาสบิวด์อินดังนั้นการใช้งานในฐานะตัวแปรจึงค่อนข้างท้อแท้
งูและกาแฟ

การเพิ่มขึ้นของ x * แต่คุณหมายถึงอะไรโดย 2 * ค่าเริ่มต้นสำหรับอะไร คุณจะอธิบายได้ไหม
Santosa Sandy

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

ใช้ list comprehension ใน python เนื่องจากคุณต้องการ 16 ในรายการด้วย .. ใช้ x2 + 1 ฟังก์ชั่นช่วงไม่รวมขีด จำกัด ที่สูงขึ้นในฟังก์ชั่น

รายการ = [x สำหรับ x ในช่วง (x1, x2 + 1)]


1
หากคุณrange()ไม่จำเป็นต้องใช้ความเข้าใจในรายการ
Billal Begueradj

@BillalBegueradj ใน Python3, range () จะส่งคืนออบเจ็กต์ที่เหมือนเครื่องกำเนิดไฟฟ้าแทนรายการ โดยพื้นฐานแล้วมันเหมือนกับ xrange () ใน Python 2 คุณพูดถูกว่ารายการไม่จำเป็นต้องมีความเข้าใจ รายการ () list(range(x1, x2+1))ฟังก์ชั่นในตัวได้ง่ายขึ้น:
Mike Housky

3

สมมติว่าคุณต้องการมีช่วงระหว่าง x ถึง y

range(x,y+1)

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

ใช้รายการสำหรับการสนับสนุน 3.x


2

ในไพ ธ อนคุณสามารถทำสิ่งนี้ได้อย่างน่าประหลาดใจ

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ฉันพบรหัสที่น่าสนใจที่จะแบ่งปัน


รายการ (custom_range (10,3,1)) ส่งคืนรายการว่าง
เดนิสราซูเลฟ

จริง ๆ เช่น[x for x in range(10, 3, 1)]- อาร์กิวเมนต์แรกคือการเริ่มต้นที่สองสิ้นสุดและขั้นตอนสุดท้าย ==> stop> start
Michael

0

ทุกคำตอบข้างต้นถือว่าอยู่ในช่วงของจำนวนบวกเท่านั้น นี่คือวิธีแก้ปัญหาเพื่อส่งคืนรายการหมายเลขติดต่อกันโดยที่อาร์กิวเมนต์สามารถเป็นใดก็ได้ (บวกหรือลบ) โดยมีความเป็นไปได้ในการตั้งค่าขั้นตอนเพิ่มเติม (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

ตัวอย่างเช่นคำสั่งมาตรฐานlist(range(1,-3))ส่งคืนรายการว่าง[]ขณะที่ฟังก์ชันนี้จะส่งคืน[-3,-2,-1,0,1]

อัปเดต : ตอนนี้ขั้นตอนอาจเป็นค่าลบ ขอบคุณ @Michael สำหรับความคิดเห็นของเขา


1
สิ่งนี้จะถือว่าขั้นตอนของคุณเป็นไปในเชิงบวก
Michael

@Michael จุดดี ผมได้ปรับปรุงรหัสดังนั้นตอนนี้คุณสามารถมีขั้นตอนเชิงลบ :)
เดนิส Rasulev

@tgikal ถูกต้องแล้ว แต่ถ้าคุณไม่รู้ว่าค่าใดที่จะถูกกำหนดให้กับข้อโต้แย้งของฟังก์ชั่นของคุณและคุณต้องกลับมาเรียงลำดับ?
เดนิสราซูเลฟ

ฉันไม่เห็นคุณลักษณะเพิ่มเติมใด ๆ ที่ฟังก์ชันแบบกำหนดเองของคุณทำซึ่งไม่สามารถทำได้โดยใช้ฟังก์ชันช่วง builtin ฉันเดาว่าตัวอย่างของการปรับปรุงจะดีมากเนื่องจากตัวอย่างปัจจุบันของคุณคือi_min = -3, i_max = 1 any_number_range(i_max, i_min))ผลตอบแทนโดยทั่วไป[-3,-2,-1,0,1] แต่ builtin list(range(i_min, i_max + 1))จะคืนค่าเดิม
tgikal

ลองใช้ขั้นตอนเชิงลบเมื่อลดลำดับlist(range(1,-3, -1))
Juan Antonio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.