2013-03-26 31 views
9

Hãy tưởng tượng một số mảng sần sờ, ví dụ: x = np.linspace(1,10).Tôi nên sử dụng giá trị nào trong một phạm vi cắt để bao gồm giá trị cuối cùng trong một mảng có nhiều mảng?

x[i:j] cho tôi chế độ xem x cho phạm vi [i,j). Tôi thích rằng tôi cũng có thể làm x[i:-k] loại trừ các yếu tố k cuối cùng.

Tuy nhiên, để bao gồm yếu tố cuối cùng tôi cần làm x[i:].

Câu hỏi của tôi là: Làm cách nào để kết hợp hai ký hiệu này nếu tôi chẳng hạn cần lặp lại trên k.

Nói rằng tôi muốn làm điều này:

l = list() 
for k in [5,4,3,2,1]: 
    l.append(x[:-k]) 
l.append(x[:]) 

gì làm phiền tôi là dòng cuối cùng. Trong ví dụ đơn giản này tất nhiên nó không làm nhiều sự khác biệt, nhưng đôi khi điều này trở nên khó chịu hơn nhiều. Những gì tôi nhớ là một cái gì đó giống như DRY.

Khóa đoạn sau đây KHÔNG mang lại kết quả mong muốn, nhưng đại diện cho phong cách của mã tôi tìm kiếm:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:-k]) 

Cảm ơn advaned.

+0

làm thế nào để kết quả sản xuất bởi rằng đoạn cuối cùng khác với kết quả mong muốn của bạn? Tôi không hoàn toàn rõ ràng về những gì bạn đang thực sự cố gắng để sản xuất. –

+0

@MattBall Đoạn cuối, khi 'k = 0', sẽ đánh giá' x [: - 0] ', là một mảng trống, trái với' x [:] 'là mảng hoàn chỉnh. – lxop

+0

bản sao có thể có của [danh sách/mảng Python: vô hiệu hóa việc lập chỉ mục phủ định xung quanh trong lát] (http://stackoverflow.com/questions/13410615/python-lists-arrays-disable-negative-indexing-wrap-around-in- slice) – wim

Trả lời

8

Đó là một chút đau đớn, nhưng vì -0 cũng giống như 0 , Không có giải pháp dễ dàng.

Một cách để làm điều đó sẽ là:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:-k or None]) 

Điều này là do khi k là 0, -k or NoneNone, và x[:None] sẽ làm những gì bạn muốn. Đối với các giá trị khác của k, -k or None sẽ là -k.

Tôi không chắc mình có thích nó không.

0

Có lẽ điều này, thì:

l = list() 
for k in [5,4,3,2,1,None]: 
    l.append(x[:-k if k else None]) 

Nếu x chỉ đơn giản là range(10), các mã trên sẽ sản xuất:

[[0, 1, 2, 3, 4], 
[0, 1, 2, 3, 4, 5], 
[0, 1, 2, 3, 4, 5, 6], 
[0, 1, 2, 3, 4, 5, 6, 7], 
[0, 1, 2, 3, 4, 5, 6, 7, 8], 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]  
4

Giá trị None, trong một lát, giống như không đặt gì ở đó. Nói cách khác, x[:None] cũng giống như x[:]. Vì vậy:

l = list() 
for k in [-5,-4,-3,-2,-1,None]: 
    l.append(x[:k]) 

Tuy nhiên ... mã này là dễ dàng hơn nhiều để viết như một danh sách hiểu:

l = [x[:k] for k in (-5,-4,-3,-2,-1,None)] 

Hoặc ... bạn có thể muốn xem xét bất cứ điều gì nó là bạn đang cố gắng để làm và nhìn thấy nếu có một sự trừu tượng mức cao hơn có ý nghĩa, hoặc có thể chỉ là một cách khác để tổ chức những thứ dễ đọc hơn (ngay cả khi nó có nhiều chi tiết hơn).Ví dụ, tùy thuộc vào những gì x thực sự đại diện, điều này có thể hiểu hơn (hoặc nó có thể là ít hơn, tất nhiên):

l = [] 
for k in range(6): 
    l.insert(0, x) 
    x = x[:-1] 
8

Bạn không thể, bởi vì -0 không cắt theo cách đó trong python (nó trở thành 0)

bạn chỉ có thể làm trường cũ:

l = list() 
for k in [5,4,3,2,1,0]: 
    l.append(x[:len(x)-k]) 
+0

+1 khi tôi gặp vấn đề tương tự, đây là giải pháp đơn giản và rõ ràng nhất – wim

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