2016-01-07 21 views
5

tôi có một danh sách, chúng ta hãy nói:Python tìm ra chỉ số của một danh sách được đưa ra một điều kiện

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

Tôi muốn tìm ra tối thiểu và tối đa chỉ số của danh sách này, nơi list_A> 0.

tức là trong ví dụ trên, nó sẽ là 3 và 7.

Đối với các danh sách khác, làm tăng đơn điệu, tôi đã được sử dụng np.searchsorted, như np.searchsorted(list,[0.5,1.0]) để tìm các chỉ số trong danh sách tương ứng là between 0.5 and 1.0.

Nhưng trường hợp này hoàn toàn khác và np.searchsorted không hoạt động ở đây hoặc có thể theo cách mà tôi không biết!

+0

này được nhân đôi http://stackoverflow.com/questions/7270321/finding-the-index-of-elements-based-on -a-condition-using-python-list-comprehensi (không biết cách đánh dấu như thế) – tglaria

Trả lời

4

Lọc danh sách nén với indixes của nó và lấy min và max:

>>> list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 
>>> filtered_lst = [(x,y) for x,y in enumerate(list_A) if y > 0] 
>>> max(filtered_lst) 
(7, 1.0) 
>>> min(filtered_lst) 
(3, 1.0) 

Nếu bạn chỉ cần chỉ mục, giải nén giá trị trả về:

>>> maX,_ = max(filtered_lst) 
>>> maX 
7 
+0

Giải pháp của bạn thực sự đơn giản. Nhưng điều tôi cần chỉ là chỉ mục, không phải là giá trị (tức là 1.0). 'filter_list [0]' không hoạt động? – ThePredator

+0

@Lafexlos, cũng là một lựa chọn tốt. – Netwave

2

Một thay thế sẽ được sử dụng next():

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

print(next(idx for idx, item in enumerate(list_A) if item>0)) 
print(next(len(list_A)-1-idx for idx, item in enumerate(list_A[::-1]) if item>0)) 

Đầu ra

3 
7 

Sử dụng next() để tìm mục đầu tiên trong danh sách > 0 là một giải pháp thanh lịch.

Để tìm số mục cuối cùng trong danh sách > 0 thì phức tạp hơn với phương pháp này. Tôi sử dụng next() để lặp lại và tìm số đầu tiên mục > 0 trong danh sách được đảo ngược bằng cách sử dụng list_A[::-1]. Sau đó tôi chuyển đổi chỉ mục được tạo thành chỉ mục chính xác bằng cách trừ chỉ mục từ len(list)-1, sử dụng len(list)-1-idx.

+0

bạn có thể làm sáng tỏ thêm một chút về bước thứ hai đang làm không? – ThePredator

+0

Trợ giúp chỉnh sửa có hiệu quả không? – gtlambert

+0

Có! Nhưng tôi thấy giải pháp của Daniel thân thiện với người dùng hơn để đọc. Vì vậy, tôi đã chấp nhận rằng như là câu trả lời – ThePredator

0

Bạn có thể sử dụng np.where hàm trả về chỉ số của tất cả các elements > 0

In [116]: list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

In [117]: arr = np.array(list_A) 

In [118]: indx = np.where(arr > 0)[0] 

In [119]: mini = indx[0] 

In [120]: mini 
Out[120]: 3 

In [121]: maxi = indx[-1] 

In [122]: maxi 
Out[122]: 7 
Các vấn đề liên quan