2012-07-09 29 views
7

Tôi cần đặt một tập hợp con của một danh sách thành một giá trị cụ thể dựa trên một bộ dữ liệu có giới hạn (start,end).Python - đặt phạm vi danh sách thành một giá trị cụ thể

Hiện nay tôi đang làm điều này:

indexes = range(bounds[0], bounds[1] + 1) 
for i in indexes: 
    my_list[i] = 'foo' 

này dường như không tốt với tôi. Có một cách tiếp cận nhiều hơn pythonic?

+1

Bạn có thể sử dụng phân lát, nhưng tôi nghĩ rằng phương pháp của bạn là tốt. Nhân tiện, số nhiều chỉ mục là _indices_. – wim

+2

Thành thật mà nói, cách họ đang làm là tốt và dễ đọc, tôi không nghĩ rằng việc nén nó xuống một dòng sẽ thêm bất cứ điều gì. –

+2

@wim, tôi cũng thích _indices_, nhưng hầu hết các từ điển hiện đại đều nhận ra cả hai đều được chấp nhận. – senderle

Trả lời

11

Sử dụng phân lát:

my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0]) 

hoặc sử dụng các biến địa phương để thêm + 1 chỉ một lần:

lower, upper = bounds 
upper += 1 
my_list[lower:upper] = ['foo'] * (upper - lower) 

Bạn có thể muốn lưu trữ trên ràng buộc là không bao gồm, để chơi tốt hơn với python và tránh tất cả số lượng + 1.

Demo:

>>> my_list = range(10) 
>>> bounds = (2, 5) 
>>> my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0]) 
>>> my_list 
[0, 1, 'foo', 'foo', 'foo', 'foo', 6, 7, 8, 9] 
+5

+1 để "lưu trữ giới hạn trên là không bao gồm". N + 1 lỗi là một nỗi đau lớn. – senderle

2
>>> L = list("qwerty") 
>>> L 
['q', 'w', 'e', 'r', 't', 'y'] 
>>> L[2:4] = ["foo"] * (4-2) 
>>> L 
['q', 'w', 'foo', 'foo', 't', 'y'] 
1

Đây là một phiên bản hiệu quả hơn các giải pháp bằng cách sử dụng @MartijnPieters itertools.repeat

import itertools 
lower, upper = bounds 
upper += 1 
my_list[lower:upper] = itertools.repeat('foo', (upper - lower)) 
Các vấn đề liên quan