Как вернуть часть массива в Ruby?
список в Python я могу вернуть часть его, используя следующий код:
foo = [1,2,3,4,5,6]
bar = [10,20,30,40,50,60]
half = len(foo) / 2
foobar = foo[:half] + bar[half:]
поскольку Ruby делает все в массивах, мне интересно, есть ли что-то подобное.
6 ответов:
да, Ruby имеет очень похожий синтаксис нарезки массива на Python. Вот это
ri
документация для метода индекса массива:--------------------------------------------------------------- Array#[] array[index] -> obj or nil array[start, length] -> an_array or nil array[range] -> an_array or nil array.slice(index) -> obj or nil array.slice(start, length) -> an_array or nil array.slice(range) -> an_array or nil ------------------------------------------------------------------------ Element Reference---Returns the element at index, or returns a subarray starting at start and continuing for length elements, or returns a subarray specified by range. Negative indices count backward from the end of the array (-1 is the last element). Returns nil if the index (or starting index) are out of range. a = [ "a", "b", "c", "d", "e" ] a[2] + a[0] + a[1] #=> "cab" a[6] #=> nil a[1, 2] #=> [ "b", "c" ] a[1..3] #=> [ "b", "c", "d" ] a[4..7] #=> [ "e" ] a[6..10] #=> nil a[-3, 3] #=> [ "c", "d", "e" ] # special cases a[5] #=> nil a[5, 1] #=> [] a[5..10] #=> []
Если вы хотите разделить/вырезать массив по индексу i,
arr = arr.drop(i) > arr = [1,2,3,4,5] => [1, 2, 3, 4, 5] > arr.drop(2) => [3, 4, 5]
можно использовать slice () для этого:
>> foo = [1,2,3,4,5,6] => [1, 2, 3, 4, 5, 6] >> bar = [10,20,30,40,50,60] => [10, 20, 30, 40, 50, 60] >> half = foo.length / 2 => 3 >> foobar = foo.slice(0, half) + bar.slice(half, foo.length) => [1, 2, 3, 40, 50, 60]
кстати, насколько мне известно, Python "списки" - это просто эффективно реализованные динамически растущие массивы. Вставка в начале находится в O(n), вставка в конце амортизируется O(1), произвольный доступ-O (1).
другой способ-использовать метод диапазона
foo = [1,2,3,4,5,6] bar = [10,20,30,40,50,60] a = foo[0...3] b = bar[3...6] print a + b => [1, 2, 3, 40, 50 , 60]
Мне нравятся диапазоны для этого:
def first_half(list) list[0...(list.length / 2)] end def last_half(list) list[(list.length / 2)..list.length] end
тем не менее, будьте очень осторожны, включена ли конечная точка в ваш диапазон. Это становится критическим в списке нечетной длины, где вам нужно выбрать, где вы собираетесь сломать середину. В противном случае вы будете в конечном итоге двойной подсчет среднего элемента.
приведенный выше пример будет последовательно помещать средний элемент в последнюю половину.