2013-04-26 29 views
6

Trong Python tôi có thể chia mảng bằng "bước nhảy". Ví dụ:chia mảng thành mảng phụ theo bước trong Ruby

In [1]: a = [1,2,3,4,5,6,7,8,9] 

In [4]: a[1:7:2] # start from index = 1 to index < 7, with step = 2 
Out[4]: [2, 4, 6] 

Ruby có thể làm được không?

+0

Trả lời ngắn gọn: Không có ký pháp viết tắt số. –

+0

Ví dụ của bạn là không tốt vì nó không rõ ràng cho dù bạn muốn bỏ qua các giá trị hoặc bởi các chỉ số (có thể là sau này). – sawa

+0

Nếu đó là vòng lặp for trong bất kỳ ngôn ngữ nào khác, anh ta muốn 'i ++' là' i + 2' cho mỗi lần lặp trong trường hợp này. –

Trả lời

6
a = [1,2,3,4,5,6,7,8,9] 
a.values_at(*(1...7).step(2)) - [nil] 
#=> [2, 4, 6] 

Mặc dù trong trường hợp trên phần - [nil] là không cần thiết, nó phục vụ chỉ trong trường hợp phạm vi của bạn vượt quá kích thước của mảng, nếu không bạn có thể nhận được một cái gì đó như thế này:

a = [1,2,3,4,5,6,7,8,9] 
a.values_at(*(1..23).step(2)) 
#=> [2, 4, 6, 8, nil, nil, nil, nil, nil, nil, nil, nil] 
+1

+1, đây là một. Tôi đã viết một câu trả lời với 'values_at (* (1 ... 7) .step (2))' và sau đó tôi thấy của bạn :-) Có lẽ nó tốt hơn '1 ... 7' để sử dụng 7 (số OP đề cập đến) thay vì 6. – tokland

+0

@tokland cảm ơn nhận xét của bạn, tôi vừa cập nhật làm bình luận của bạn. –

+0

đây là câu trả lời ngắn :) cảm ơn bạn. –

2

Trong ruby , để có được cùng một kết quả:

a = [1,2,3,4,5,6,7,8,9] 
(1...7).step(2).map { |i| a[i] } 
=> [2, 4, 6] 
2

Nếu bạn thực sự bỏ lỡ cú pháp bước của Python, bạn có thể làm cho Ruby thực hiện điều gì đó tương tự.

class Array 
    alias_method :brackets, :[] 

    def [](*args) 
    return brackets(*args) if args.length != 3 
    start, stop, step = *args 
    self.values_at(*(start...stop).step(step)) 
    end 
end 

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] 
arr[1,7,2] 
#=> [2, 4, 6] 
+0

Python cho phép bỏ qua bất kỳ ví dụ nào của args, 'a [2 :: 3]'. –

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