2009-08-15 20 views
8

Tôi đã mucking xung quanh một chút với Python, và tôi đã thu thập được rằng nó thường là tốt hơn (hoặc 'pythonic') để sử dụngTruy cập vào các yếu tố với offsets trong Python cho .. trong vòng

for x in SomeArray: 

thay so với hơn C-style

for i in range(0, len(SomeArray)): 

tôi làm thấy được lợi ích trong việc này, mã chủ yếu là bụi, và khả năng sử dụng các chức năng đẹp map() và có liên quan. Tuy nhiên, tôi thường xuyên phải đối mặt với tình huống mà tôi muốn đồng thời truy cập vào các yếu tố của các offset khác nhau trong mảng. Ví dụ, tôi có thể muốn thêm phần tử hiện tại vào phần tử sau hai bước. Có cách nào để làm điều này mà không cần đến các chỉ mục rõ ràng?

+1

Lưu ý rằng phạm vi (0, len (SomeArray)) tương đương với phạm vi thông thường hơn (len (SomeArray)). – EOL

Trả lời

14

Cách để làm điều này bằng Python là:

for i, x in enumerate(SomeArray): 
    print i, x 

Các máy phát điện enumerate tạo ra một chuỗi các 2-tuples, mỗi có chứa chỉ số mảng và nguyên tố này.

+0

Nhưng làm cách nào để truy cập các phần tử trước đó/tiếp theo trong một lần lặp của vòng lặp? – int3

+0

Bên trong vòng lặp, bạn có thể truy cập SomeArray [i-1] hoặc SomeArray [i + 1]. –

+0

'SomeArray [i-1]'? Nhưng bạn có thể muốn giải thích những gì bạn đang thực sự làm – SilentGhost

6

Lập chỉ mục danh sách và zip() là bạn của bạn.

Dưới đây là câu trả lời của tôi cho câu hỏi cụ thể hơn của bạn:

tôi có thể muốn thêm các yếu tố hiện tại để nguyên tố này hai bước đằng sau nó. Có cách nào để làm điều này mà không cần đến các chỉ mục rõ ràng?

arr = range(10) 
[i+j for i,j in zip(arr[:-2], arr[2:])] 

Bạn cũng có thể sử dụng các mô-đun numpy nếu bạn có ý định làm việc trên mảng số. Ví dụ, đoạn mã trên có thể được viết thanh lịch hơn như:

import numpy 
narr = numpy.arange(10) 
narr[:-2] + narr[2:] 

Thêm yếu tố thứ n tới phần tử thứ (n-2) là tương đương với việc thêm các yếu tố mth tới phần tử (m + 2) (đối với toán học nghiêng, chúng tôi thực hiện thay thế n-> m + 2). Phạm vi của n là [2, len (arr)) và phạm vi m là [0, len (arr) -2). Lưu ý các dấu ngoặc và dấu ngoặc đơn. Các phần tử từ 0 đến len (arr) -3 (bạn loại trừ hai phần tử cuối cùng) được lập chỉ mục là [: -2] trong khi các phần tử từ 2 đến len (arr) -1 (bạn loại trừ hai phần tử đầu tiên) được lập chỉ mục là [ 2:].

Tôi cho rằng bạn đã biết tính năng hiểu danh sách.

+0

yep Tôi biết hiểu danh sách. đã không thực sự sử dụng chúng mặc dù. zip() trông giống như một giải pháp tốt đẹp khác, cảm ơn! – int3

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