Я пытаюсь объединить эти массивы:Ruby: сочетающие массивы
[[1,2,3],[4,5,6],[7,8,9]]
[["a","b"], ["c","d"], ["e","f"]]
следующим образом:
[[1,2,3,"a","b"], [4,5,6,"c","d"], [7,8,9,"e","f"]]
, но я не удается найти правильный ответ.
Я пытаюсь объединить эти массивы:Ruby: сочетающие массивы
[[1,2,3],[4,5,6],[7,8,9]]
[["a","b"], ["c","d"], ["e","f"]]
следующим образом:
[[1,2,3,"a","b"], [4,5,6,"c","d"], [7,8,9,"e","f"]]
, но я не удается найти правильный ответ.
Во-первых, вплетают массивы с Enumerable#zip
, то flatten
каждый элемент в новом массиве:
a = [[1,2,3],[4,5,6],[7,8,9]]
b = [["a","b"], ["c","d"], ["e","f"]]
a.zip(b).map(&:flatten)
# => [[1, 2, 3, "a", "b"], [4, 5, 6, "c", "d"], [7, 8, 9, "e", "f"]]
Если вы не знакомы, то «кренделя синтаксис двоеточие» foo(&:bar)
эквивалентно foo { |x| x.bar }
(на самом деле не синтаксиса, просто вызов метода под капотом).
Спасибо, вот и все! – user1754606
Enumerable - фантастическая коллекция методов. Любой, кто новичок в Ruby, должен потратить некоторое время на чтение того, что находится в этом сундуке. Не слышал, что это называется «prezel-colon», так что это ново. – tadman
Я хотел бы сделать это следующим образом:
def combine(a,b)
a.zip(b).map { |a,b| a+b }
end
a = [[1,2,3],[4,5,6],[7,8,9]]
combine a, [[4],[5],[6]]
#=> [[1, 2, 3, 4], [4, 5, 6, 5], [7, 8, 9, 6]]
combine a, [[4],[5],[[6,7],[8,9]]]
#=> [[1, 2, 3, 4], [4, 5, 6, 5], [7, 8, 9, [6, 7], [8, 9]]]
flatten
не дает второй результат.
попробовать этот
a=[[1,2,3],[4,5,6],[7,8,9]]
b=[["a","b"], ["c","d"], ["e","f"]]
a.zip(b).map{|x| x.flatten 1}
Пояснение:
Метод zip
ожидает переменное количество аргументов и возвращает массив массивов, которые содержат соответствующие элементы из каждой матрицы. То есть элемент-мудрый сливается с исходным массивом. Пример кода:
[4, 8, 15, 16, 23, 42].zip([42, 23, 16, 15, 8]) #=> [[4, 42], [8, 23], [15, 16], [16, 15], [23, 8], [42, nil]]
Метод flatten
возвращает одномерный массив представление массива. Он рекурсивно выбирает все элементы из внутренних массивов и выводит их из внешнего массива.
[4, [8], [15],[[[[30,[[[[6]]]]]]],15], [16, [23, 42]]].flatten #=> [4, 8, 15, 30, 6, 15, 16, 23, 42]
так что в приведенном выше примере a.zip(b)
будет возвращать [[[1, 2, 3], ["a", "b"]], [[4, 5, 6], ["c", "d"]], [[7, 8, 9], ["e", "f"]]]
, а затем на каждом элементе flatten
применяется, который будет удален вложенный массив и дают нам требуемый результат.
Hiya, это вполне может решить проблему ... но было бы хорошо, если бы вы могли отредактировать свой ответ и дать небольшое объяснение о том, как и почему оно работает :) Не забывайте - есть кучи новичков в переполнении стека , и они могли бы узнать кое-что из вашего опыта - что очевидно для вас, возможно, не так для них. –
Зачем вы отправляете ответ, аналогичный тому, который был опубликован ранее? –
Что вы пытаетесь? Вы не можете просто сбрасывать с нас требования и говорить «спасибо». Это не сайт для кодера для аренды. Вы должны опубликовать свое попытку для нас, чтобы помочь вам найти причину, по которой он не работает. – meagar
Мне очень жаль meagar. Я совершенно новый для рубинов и SO. Я попробовал array1 + array2, zip и несколько других вещей, которые я нашел в сети. Я не включил их, так как я не думал, что они добавляют к моему вопросу. – user1754606
Вы, конечно, не дали много времени, чтобы другие могли публиковать ответы. Увидев, что зеленая галочка вспыхивает через 15 минут, вызывает разочарование. –