Як зробити список двоелементних списків у хеш?


9

У мене є список двоелементних списків, як, наприклад, те, що ви отримаєте, наприклад, від того (1..5) Z (20..24), що я хочу перетворити на хеш (у цьому прикладі, що ви отримуєте {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Я міг би це зробити "від руки", але це не так Я не надто елегантний, і я впевнений, що Раку має ідіоматичний спосіб зробити це. Неелегантною альтернативою, яку я придумав, є:

my @a = (1..5) Z (20..24);
my %a;
for @a -> @x {
   %a{@x[0]} = @x[1];

Відповіді:


12
my %h = (1..5) Z=> (20..24);
say %h;  # {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 => 24}

ZМета-оператор приймає оператор , як частина його імені, і по замовчуванням ,, таким чином , створюючи списки за умовчанням. Якщо ви додасте Pairконструктор (він називається жирною комою), ви створите список Pairs, який ви можете вводити в Hash.

Альтернативним рішенням буде flatдесяти результат Z:

my %h = flat (1..5) Z (20..24);

1
У цьому конкретному прикладі це прекрасно працює. Але що робити, якщо я отримав список двоелементних списків якось ще?
vonbrand

1
Тоді flatмає працювати другий варіант використання .
Елізабет Маттійсен

1
@vonbrand Стратегія вирівнювання є повністю загальною. flatбуде вирівнювати кілька рівнів багаторівневої структури даних, якщо рівні Lists. Але якщо ви вже ввели інші List, наприклад, присвоєння даних Arrayбез використання, flat перш ніж це робити, то flatце вже не буде правильним інструментом. Наприклад, якщо ви призначили його за допомогою, my @a = 1..5 Z 20..25;тоді flatпоодинці не виконаєте роботу. Я б це сплющив так my %h = @a[*;*];. Я написав трохи більше про використання підписок для вирівнювання багаторівневих даних тут .
raiph

@ralph, а як щодо ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(тобто кінцевим результатом буде хеш із списками як значення)?
фонбранд
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.