Как добавить массив в другой массив в Ruby и не получить многомерный результат? - PullRequest
431 голосов
/ 26 ноября 2009
somearray = ["some", "thing"]

anotherarray = ["another", "thing"]

somearray.push(anotherarray.flatten!)

Я ожидал

["some","thing","another","thing"]

Ответы [ 16 ]

8 голосов
/ 25 ноября 2015

Вопрос, по сути, заключается в том, «как объединить массивы в Ruby». Естественно, ответом является использование concat или +, как упоминалось почти в каждом ответе.

Естественным продолжением вопроса будет «как выполнить построчную конкатенацию 2D-массивов в Ruby». Когда я погуглил «матрицы конкатенации рубина», этот ТА-вопрос стал лучшим результатом, поэтому я решил оставить свой ответ на этот (не заданный, но связанный) вопрос здесь для потомков.


В некоторых приложениях может потребоваться «объединить» два 2D-массива по строкам. Что-то вроде

[[a, b], | [[x],    [[a, b, x],
 [c, d]] |  [y]] =>  [c, d, y]]

Это что-то вроде «увеличения» матрицы. Например, я использовал эту технику, чтобы создать одну матрицу смежности для представления графа из множества меньших матриц. Без этой техники мне пришлось бы перебирать компоненты таким образом, чтобы это могло привести к ошибкам или разочарованию. Я мог бы, например, сделать each_with_index. Вместо этого я объединил zip и flatten следующим образом

# given two multi-dimensional arrays that you want to concatenate row-wise
m1 = [[:a, :b], [:c, :d]]
m2 = [[:x], [:y]]

m1m2 = m1.zip(m2).map(&:flatten)
# => [[:a, :b, :x], [:c, :d, :y]]
5 голосов
/ 26 ноября 2009

["some", "thing"] + ["another" + "thing"]

4 голосов
/ 25 марта 2017

Я удивлен, что никто не упомянул reduce, что хорошо работает, когда у вас есть массив массивов:

lists = [["a", "b"], ["c", "d"]]
flatlist = lists.reduce(:+)  # ["a", "b", "c", "d"]
4 голосов
/ 07 мая 2015

Если новые данные могут быть массивом или скаляром, и вы хотите запретить вложение новых данных, если это массив, оператор splat - это круто! Он возвращает скаляр для скаляра и распакованный список аргументов для массива.

1.9.3-p551 :020 > a = [1, 2]
 => [1, 2] 
1.9.3-p551 :021 > b = [3, 4]
 => [3, 4] 
1.9.3-p551 :022 > c = 5
 => 5 
1.9.3-p551 :023 > a.object_id
 => 6617020 
1.9.3-p551 :024 > a.push *b
 => [1, 2, 3, 4] 
1.9.3-p551 :025 > a.object_id
 => 6617020 
1.9.3-p551 :026 > a.push *c
 => [1, 2, 3, 4, 5] 
1.9.3-p551 :027 > a.object_id
 => 6617020 
3 голосов
/ 04 декабря 2018
a = ['a', 'b']
b = ['c', 'd']
arr = [a, b].flatten

Это не удалит дубликаты, но

a|b

удаляет дубликаты.

2 голосов
/ 26 ноября 2009

Мне легче вставлять или добавлять массивы, а затем выравнивать их, например, так:

somearray = ["some", "thing"]
anotherarray = ["another", "thing"]
somearray.push anotherarray # => ["some", "thing", ["another", "thing"]]
#or
somearray << anotherarray # => ["some", "thing", ["another", "thing"]]
somearray.flatten!  # => ["some", "thing", "another", "thing"]
somearray # => ["some", "thing", "another", "thing"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...