Как сделать список из 2-х элементов в хеш?

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];
vonbrand
источник

Ответы:

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

ZМета-оператор принимает оператор , как часть его имени, и по умолчанию ,, таким образом , создавая списки по умолчанию. Если вы добавите Pairконструктор (он же fat-запятая), вы создадите список Pairs, который вы можете добавить в Hash.

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

my %h = flat (1..5) Z (20..24);
Элизабет Маттийсен
источник
1
Для этого конкретного примера это работает отлично. Но что, если я получу список двухэлементных списков как-нибудь еще?
vonbrand
1
Тогда второй вариант использования flatдолжен работать.
Элизабет Маттийсен
1
@vonbrand Стратегия сглаживания является полностью общей. flatсгладит несколько уровней многоуровневой структуры данных, если уровни Lists. Но если вы уже ввели non- Lists, например, присваиваете данные Arrayбез использования flat до того, как это сделать, то flatбольше не будет подходящим инструментом. Например, если вы назначили его с помощью, my @a = 1..5 Z 20..25;то flatодин не будет делать эту работу. Я бы сгладил это так my %h = @a[*;*];. Я написал немного больше об использовании подписок для выравнивания многоуровневых данных здесь .
Райф
@ralph, как насчет ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(то есть конечным результатом будет хеш со списками в качестве значений)?
vonbrand