gpt4 book ai didi

arrays - Python 列表理解 => Ruby 选择/拒绝索引而不是元素

转载 作者:数据小太阳 更新时间:2023-10-29 07:23:33 24 4
gpt4 key购买 nike

给定:

arr=[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
0 1 2 3 4 5 6 7 8 9 # index of arr

在 Python 中,通过在列表理解中组合 enumerateif 子句,可以选择或拒绝给定元素索引的列表元素:

除第三项外的每一项:

>>> [e for i,e in enumerate(arr) if i%3]
[20, 30, 50, 60, 80, 90]

列表中的每三个项目:

>>> [e for i,e in enumerate(arr) if not i%3]
[10, 40, 70, 100]

或者,更简单,使用切片:

>>> arr[::3]
[10, 40, 70, 100]

在 Ruby 中,我们有 .select.reject

> arr.each_with_index.reject { |e,i| i%3==0 }
=> [[20, 1], [30, 2], [50, 4], [60, 5], [80, 7], [90, 8]]
> arr.each_with_index.select { |e,i| i%3==0 }
=> [[10, 0], [40, 3], [70, 6], [100, 9]]

然后申请.collect对此:

> arr.each_with_index.select { |e,i| i%3==0 }.collect{|e,i| e}
=> [10, 40, 70, 100]

对于切片,粗略的 Ruby 等价物可能是:

> (0..arr.length).step(3).each { |e| p arr[e] }
10
40
70
100
=> 0..10

但我不知道如何将它们收集到一个新数组中,除了:

> new_arr=[]
=> []
> (0..arr.length).step(3).each { |e| new_arr.push(arr[e]) }
=> 0..10
> new_arr
=> [10, 40, 70, 100]

问题:

  1. 这些是最适合我正在尝试做的事情的 Ruby 习语吗(.select 或 .reject with .collect)?
  2. 有没有办法用切片按照这些思路做一些事情:
    new_arr=(0..arr.length).step(3).each { |e| arr[e] }.some_method?

最佳答案

方法顺序相关:

arr.each_with_index.select { |e, i| i % 3 == 0 }
#=> [[10, 0], [40, 3], [70, 6], [100, 9]]

对比:

arr.select.each_with_index { |e, i| i % 3 == 0 }
#=> [10, 40, 70, 100]

由于 select 返回一个枚举器,您还可以使用 Enumerator#with_index :

arr.select.with_index { |e, i| i % 3 == 0 }
#=> [10, 40, 70, 100]

关于您的切片等效项,您可以使用 map(或其别名 collect)来收集数组中的项目:

(0..arr.length).step(3).map { |e| arr[e] }
#=> [10, 40, 70, 100]

values_at获取给定索引处的项目:

arr.values_at(*(0..arr.length).step(3))
#=> [10, 40, 70, 100]

* 把参数变成一个数组(通过to_a)然后变成一个参数列表,即:

arr.values_at(*(0..arr.length).step(3))
arr.values_at(*(0..arr.length).step(3).to_a)
arr.values_at(*[0, 3, 6, 9])
arr.values_at(0, 3, 6, 9)

稍微短一些:

arr.values_at(*0.step(arr.size, 3))
#=> [10, 40, 70, 100]

关于arrays - Python 列表理解 => Ruby 选择/拒绝索引而不是元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44889248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com