2012-02-02 36 views
24

Có cách nào tốt hơn để trích xuất các chỉ mục tùy ý khỏi danh sách trong python không?Danh sách Python Cắt với chỉ số tùy ý

Phương pháp tôi hiện đang sử dụng là:

a = range(100) 
s = [a[i] for i in [5,13,25]] 

đâu a là mảng tôi muốn cắt và [5,13,25] là những yếu tố mà tôi muốn để có được. Có vẻ như nhiều hơn nữa tiết hơn so với Matlab tương đương:

a = 0:99; 
s = a([6,14,26]) 
+7

"Nó có vẻ dài hơn nhiều so với Matlab". Chúng là các ngôn ngữ khác nhau. Những gì bạn đã mong đợi? Python ngắn hơn ** ** so với Java. –

+0

Chỉ mục Python là 0 dựa trên. '5' của bạn có nghĩa là phần tử thứ sáu. Một ngôn ngữ dựa trên 1 sẽ có một '6' ở đó. Làm thế nào đến Matlab cần '4'? Nó có bắt đầu từ -1 không? –

+0

Cách này thực sự rất dễ đọc và tôi thích nó. – becko

Trả lời

31
>>> from operator import itemgetter 
>>> a = range(100) 
>>> itemgetter(5,13,25)(a) 
(5, 13, 25) 
+3

Lưu ý điều kiện cạnh này nếu sử dụng danh sách làm chỉ mục: indexes = [1,]; itemgetter (* indexes) (a) ----> trả về một số nguyên, không phải là một tuple – rrauenza

+0

Cảm ơn bạn! Với chức năng này, nó phải là lần đầu tiên tôi gặp phải một nhu cầu thực sự cho việc giải nén *. –

+2

Rất vui, tôi ước rằng đây là hành vi mặc định - nếu nó xảy ra sự cố và cho tôi biết nó không thể chấp nhận chỉ mục tuple, có thể thử và sử dụng bộ dữ liệu cho thứ gì đó trước. Tôi đến đây sau khi quen với ý tưởng từ việc giải quyết các nút cụm IPython theo cách tương tự. –

8

Không có "sẵn sàng thực hiện" cách - theo cách bạn làm điều đó là khá ngây thơ, và bạn có thể sử dụng nó. Nếu bạn có rất nhiều đoạn mã của mình, bạn có thể muốn sử dụng một lớp con của danh sách sẽ sử dụng cú pháp giống như MATLAB - nó có thể được thực hiện trong một vài dòng mã, gánh nặng chính là bạn phải công việc luôn sử dụng lớp mới này thay vì các danh sách được tích hợp sẵn.

class MyList(list): 
    def __getitem__(self, index): 
     if not isinstance(index, tuple): 
      return list.__getitem__(self, index) 
     return [self[i] for i in index] 

Và trên console:

>>> m = MyList(i * 3 for i in range(100)) 
>>> m[20, 25,60] 
[60, 75, 180] 
0

Nó có vẻ như bạn sẽ làm gì:

a = list(range(99)) 
    s = [a[5], a[13], a[25]] 

này có vẻ là gần như giống hệt với phiên bản matlab.

Các vấn đề liên quan