Python - Tạo danh sách với các số giữa 2 giá trị?


355

Làm cách nào để tạo danh sách có giá trị giữa hai giá trị tôi đặt? Ví dụ: danh sách sau đây được tạo cho các giá trị từ 11 đến 16:

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

Câu trả lời:


643

Sử dụng range. Trong Python 2.x, nó trả về một danh sách, vì vậy tất cả những gì bạn cần là:

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

Trong Python 3.x rangelà một trình vòng lặp. Vì vậy, bạn cần chuyển đổi nó thành một danh sách:

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

Lưu ý : Số thứ hai là độc quyền. Vì vậy, ở đây cần phải được 16+1=17

BIÊN TẬP:

Để trả lời câu hỏi về việc tăng theo 0.5, tùy chọn dễ nhất có lẽ là sử dụng 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
Tuyệt vời! Chính xác những gì tôi đang tìm kiếm! Có cách nào để tăng theo các giá trị nhỏ hơn như 0,5 so với chỉ 1 không? vì vậy [11.0, 11,5, 12,0 ...... 16.0]
chúa tể

2
@lorde Bạn có thể tăng hơn 1 với steptham số thứ ba nhưng đó vẫn là số nguyên - không nổi. Bạn không thể làm điều đó chính xác trong lib tiêu chuẩn.
Jared

@Jared tôi có thể tạo một danh sách bằng cách giảm một số giá trị sau một khoảng thời gian. như [1,2,3,5,6,7,9,10,11,13,14,15,17,18,19]

2
Tốt để nói về Python 2.x và 3.x.
Sigur

Nếu bạn đang làm việc trong trường hợp không mong muốn, hãy xem xét (trong đó x = 11, y = 17 và bước = 0,5 như trên): a_range = [x] + [x + (bước * i) cho i trong phạm vi (int ((yx) / bước))]
TheLoneDeranger

23

Bạn dường như đang tìm kiếm 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]

Để tăng thêm 0.5thay vì 1, hãy nói:

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

Chỉ là một cú đánh nhỏ. Trong khối mã đầu tiên bạn sử dụng listnhư một biến.
Rắn và cà phê

2
Trong python listlà một lớp dựng sẵn, vì vậy việc sử dụng nó như một biến số có phần không được khuyến khích
Rắn và Cà phê

x * gia tăng, nhưng ý nghĩa của 2 * startvalue, để làm gì? bạn vui lòng giải thích?
Santosa Sandy

7

Thử:

range(x1,x2+1)  

Đó là một danh sách trong Python 2.x và hoạt động chủ yếu giống như một danh sách trong Python 3.x. Nếu bạn đang chạy Python 3 và cần một danh sách mà bạn có thể sửa đổi, thì hãy sử dụng:

list(range(x1,x2+1))

5

Nếu bạn đang tìm kiếm phạm vi giống như chức năng hoạt động cho loại float, thì đây là một bài viết rất tốt .

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

Đầu ra:

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

Sử dụng danh sách hiểu trong python. Vì bạn cũng muốn 16 trong danh sách .. Sử dụng x2 + 1. Hàm phạm vi loại trừ giới hạn cao hơn trong hàm.

list = [x cho x trong phạm vi (x1, x2 + 1)]


1
Nếu bạn range()không cần sử dụng khả năng hiểu danh sách
Billal Begueradj

@BillalBegueradj Trong Python3, phạm vi () trả về một đối tượng giống như trình tạo thay vì danh sách. Về cơ bản, nó giống như xrange () trong Python 2. Bạn nói đúng rằng việc hiểu danh sách là không cần thiết. Hàm listin () được tích hợp dễ dàng hơn : list(range(x1, x2+1)).
Mike Housky

3

giả sử bạn muốn có một phạm vi từ x đến y

range(x,y+1)

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

danh sách sử dụng cho hỗ trợ 3.x


2

Trong python bạn có thể làm điều này rất háo hức

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

hoặc bạn có thể tạo một hàm đệ quy trả về một mảng cho đến một số đã cho:

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

đầu ra: ar = [10,9,8,7,6,5,4,3,2,1,0]


0

Cách thanh lịch nhất để làm điều này là bằng cách sử dụng rangechức năng tuy nhiên nếu bạn muốn tạo lại logic này, bạn có thể làm một cái gì đó như thế này:

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

Điều này tạo ra đầu ra:

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

Như được thể hiện trước đây bởi @Jared, cách tốt nhất là sử dụng rangehoặc numpy.arrangetuy nhiên tôi thấy mã thú vị được chia sẻ.


danh sách (custom_range (10,3,1)) trả về danh sách trống.
Denis Rasulev

thật vậy, giống như [x for x in range(10, 3, 1)]- đối số đầu tiên là bắt đầu, thứ hai kết thúc và bước cuối cùng. ==> dừng> bắt đầu
Michael

0

Mỗi câu trả lời ở trên giả định phạm vi chỉ là số dương. Dưới đây là giải pháp trả về danh sách các số liên tiếp trong đó các đối số có thể là bất kỳ (dương hoặc âm), với khả năng đặt giá trị bước tùy chọn (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

Ví dụ, lệnh tiêu chuẩn list(range(1,-3))trả về danh sách trống [], trong khi chức năng này sẽ trả về[-3,-2,-1,0,1]

Cập nhật : bây giờ bước có thể là tiêu cực. Cảm ơn @Michael cho nhận xét của mình.


1
Điều này giả định bước của bạn là tích cực.
Michael

@Michael, điểm tốt. Tôi đã cập nhật mã, vì vậy bây giờ bạn có thể có các bước tiêu cực :)
Denis Rasulev

@tgikal, đúng vậy. Nhưng điều gì sẽ xảy ra nếu bạn không biết những giá trị nào sẽ được gán cho các đối số của hàm của bạn và bạn cần trả về được sắp xếp?
Denis Rasulev

Tôi không thấy bất kỳ tính năng bổ sung nào mà chức năng tùy chỉnh của bạn không thể thực hiện được bằng cách sử dụng chức năng phạm vi dựng sẵn, tôi đoán một ví dụ về sự cải tiến sẽ rất tuyệt, vì ví dụ hiện tại của bạn về cơ bản là i_min = -3, i_max = 1 any_number_range(i_max, i_min))trả về [-3,-2,-1,0,1] Nhưng, nội dung list(range(i_min, i_max + 1))sẽ trả về cùng các giá trị.
tgikal

Hãy thử sử dụng một bước tiêu cực khi trình tự giảm dầnlist(range(1,-3, -1))
Juan Antonio Roldán Díaz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.