Создавать группы (порядок подмассивов имеет значение) из нескольких массивов

У меня есть три массива. Я хочу объединить три из них, но порядок имеет значение, и я НЕ хочу возвращать все перестановки. Так например:

STATE = [ 'Pennsylvania' ]
COUNTY = [ 'Bucks', 'Montgomery']
PROFESSION = ['Doctor', 'Firefighter', 'Teacher']

Ожидаемый результат:

[
  ['Pennsylvania', 'Bucks', 'Doctor'],
  ['Pennsylvania', 'Bucks', 'Firefighter'],
  ['Pennsylvania', 'Bucks', 'Teacher'],

  ['Pennsylvania', 'Montgomery', 'Doctor'],
  ['Pennsylvania', 'Montgomery', 'Firefighter'],
  ['Pennsylvania', 'Montgomery', 'Teacher']
]

Вот и все. Состояние всегда будет первым элементом. Округ всегда будет вторым пунктом. Профессия всегда будет третьим элементом и именно в этом порядке. Повторов быть не должно.

Список ГОСУДАРСТВ, ГРАФЕЙ и ПРОФЕССИИ будет продолжать расти. Но все будет по той же схеме.

Здесь все неверно:

['Bucks', 'Pennsylvania', 'Doctor']
['Teacher', 'Montgomery', 'Pennsylvania']
['Pennsylvania', 'Bucks', 'Montgomery']

Так что я пробовал? Я подумал, что, возможно, использование перестановок будет хорошим инструментом. Но, как вы догадываетесь, он создал всевозможные комбинации. Поэтому я попытался использовать ленивый итератор, чтобы ограничить результаты:

( STATE + COUNTY + PROFESSION ).permutation(3).lazy.first(10)
 => [["Pennsylvania", "Bucks", "Montgomery"], ["Pennsylvania", "Bucks", "Doctor"], ["Pennsylvania", "Bucks", "Firefighter"], ["Pennsylvania", "Bucks", "Teacher"], ["Pennsylvania", "Montgomery", "Bucks"], ["Pennsylvania", "Montgomery", "Doctor"], ["Pennsylvania", "Montgomery", "Firefighter"], ["Pennsylvania", "Montgomery", "Teacher"], ["Pennsylvania", "Doctor", "Bucks"], ["Pennsylvania", "Doctor", "Montgomery"]] 

Но, как вы можете видеть, порядок, который я хочу, не сохраняется в этом подмассиве, а также это очень ошибочно, поскольку каждый массив будет иметь переменную длину и будет расти.

Как правильно решить эту проблему в Ruby?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте Массив # продукт

STATE.product(COUNTY, PROFESSION)
 => [["Pennsylvania", "Bucks", "Doctor"],
     ["Pennsylvania", "Bucks", "Firefighter"],
     ["Pennsylvania", "Bucks", "Teacher"],
     ["Pennsylvania", "Montgomery", "Doctor"],
     ["Pennsylvania", "Montgomery", "Firefighter"],
     ["Pennsylvania", "Montgomery", "Teacher"]]

К сожалению, не видел вашего ответа перед отправкой своего. +1 добросовестно :)

Alex Reinking 27.10.2018 02:07
Ответ принят как подходящий

То, что вы ищете, - это продукт списков, а не комбинации, как дает вам функция перестановки. Ваш код даже вернет такие вещи, как ["Teacher", "Firefighter", "Montgomery"], где у вас есть две профессии. К счастью, массивы Ruby предоставляют функция продукта:

STATE.product(COUNTY, PROFESSION)
=> [["Pennsylvania", "Bucks", "Doctor"], ["Pennsylvania", "Bucks", "Firefighter"], ["Pennsylvania", "Bucks", "Teacher"], ["Pennsylvania", "Montgomery", "Doctor"], ["Pennsylvania", "Montgomery", "Firefighter"], ["Pennsylvania", "Montgomery", "Teacher"]]

Продукт списков A, B и C вернет все отдельные списки из трех элементов, которые содержат по одному элементу каждый из A, из B и из C в указанном порядке. Сравните это с вызванной вами функцией permutation, которая берет ваши три списка соединены вместе и дает вам все комбинации трех различных элементов из единого списка. Когда вы объединяете, вы отбрасываете разделение между элементами, которые вам нужны.

Другие вопросы по теме