2012-08-07 46 views
26

Trong Python, tôi có danh sách các thành phần aList và danh sách chỉ mục myIndices. Có cách nào tôi có thể truy xuất tất cả cùng một lúc các mục đó trong aList có làm chỉ mục các giá trị trong myIndices không?Python: danh sách lọc theo chỉ mục

Ví dụ:

>>> aList = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> myIndices = [0, 3, 4] 
>>> aList.A_FUNCTION(myIndices) 
['a', 'd', 'e'] 
+7

'[alist [i] for i in myIndices]' – Morwenn

+3

Nếu bạn chỉ muốn để lặp qua các yếu tố, tôi đề nghị sử dụng một biểu thức máy phát điện thay vì : '(aList [i] cho i trong myIndices) ' – hochl

Trả lời

52

Tôi không biết phương pháp nào để làm điều đó. Nhưng bạn có thể sử dụng một list comprehension:

>>> [aList[i] for i in myIndices] 
9

Chắc chắn sử dụng một danh sách hiểu nhưng đây là một chức năng nào đó (không có phương pháp list mà làm điều này). Tuy nhiên, đây là cách sử dụng không hợp lệ của itemgetter nhưng chỉ vì lợi ích của kiến ​​thức tôi đã đăng nội dung này.

>>> from operator import itemgetter 
>>> a_list = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] 
>>> my_indices = [0, 3, 4] 
>>> itemgetter(*my_indices)(a_list) 
('a', 'd', 'e') 
+0

Tôi tin rằng đây không phải là trường hợp phù hợp để sử dụng 'itemgetter'. –

+0

@BasicWolf Có bạn không nên sử dụng nó nhưng OP đã yêu cầu cho một chức năng có thể làm điều này vì vậy tôi chỉ cho thấy nó là gì. Tôi sẽ làm cho nó rõ ràng hơn rằng bạn không nên sử dụng điều này. – jamylak

+0

Tôi nghĩ rằng điều này cũng sẽ bị hạn chế bởi giới hạn về số lượng đối số tối đa mà một hàm có thể có. – Paddy3118

5

Việc lập chỉ mục theo danh sách có thể được thực hiện một cách gọn gàng. Chuyển đổi danh sách cơ sở của bạn để một mảng NumPy và sau đó áp dụng một danh sách khác như một chỉ số:

>>> from numpy import array 
>>> array(aList)[myIndices] 
array(['a', 'd', 'e'], 
    dtype='|S1') 

Nếu bạn cần, chuyển đổi trở lại danh sách ở cuối:

>>> from numpy import array 
>>> a = array(aList)[myIndices] 
>>> list(a) 
['a', 'd', 'e'] 

Trong một số trường hợp giải pháp này có thể thuận tiện hơn so với việc hiểu danh sách.

1

tôi đã không hài lòng với các giải pháp này, vì vậy tôi đã tạo ra một lớp Flexlist mà chỉ đơn giản mở rộng lớp list, và cho phép đánh chỉ số linh hoạt bởi số nguyên, lát hoặc chỉ số-list:

class Flexlist(list): 
    def __getitem__(self, keys): 
     if isinstance(keys, (int, slice)): return list.__getitem__(self, keys) 
     return [self[k] for k in keys] 

Sau đó, cho Ví dụ, bạn có thể sử dụng nó với:

aList = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g']) 
myIndices = [0, 3, 4] 
vals = aList[myIndices] 

print(vals) # ['a', 'd', 'e'] 
+0

Điều này khá hữu ích. – mikeTronix

4

bạn có thể sử dụng map

map(aList.__getitem__, myIndices) 

hoặc operator.itemgetter

f = operator.itemgetter(*aList) 
f(myIndices) 
2

Nếu bạn không yêu cầu một danh sách với truy cập đồng thời cho tất cả các yếu tố, nhưng chỉ muốn sử dụng tất cả các mục trong danh sách phụ lặp đi lặp lại (hoặc vượt qua họ một cái gì đó sẽ), nó hiệu quả hơn để sử dụng một biểu thức máy phát điện chứ không phải là danh sách hiểu:

(aList[i] for i in myIndices) 
Các vấn đề liên quan