Como transformar uma lista de listas de 2 elementos em um hash?

9

Eu tenho uma lista de listas de dois elementos, como o que você obteria, por exemplo (1..5) Z (20..24), que eu quero transformar em hash (neste exemplo, o que você ganha {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Eu poderia fazê-lo "manualmente", mas isso não é é muito elegante e tenho certeza de que Raku tem uma maneira idiomática de fazê-lo.A alternativa deselegante que encontro é:

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

Respostas:

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

O Zmeta-operador usa um operador como parte de seu nome e o padrão é o de ,criar listas por padrão. Se você adicionar o Pairconstrutor (também conhecido como fat-vírgula), criará uma lista de Pairs, na qual poderá alimentar um Hash.

Uma solução alternativa seria flatdez para o resultado de Z:

my %h = flat (1..5) Z (20..24);
Elizabeth Mattijsen
fonte
11
Para este exemplo em particular, isso funciona bem. Mas e se eu conseguisse a lista de listas de dois elementos de alguma forma?
vonbrand 28/03
11
Então a segunda opção usando flatdeve funcionar.
Elizabeth Mattijsen 28/03
11
@vonbrand A estratégia de achatamento é totalmente geral. flatnivelará vários níveis de uma estrutura de dados multinível se os níveis forem Lists. Mas se você já introduziu não- Lists, por exemplo, atribuir os dados a um Arraysem usar flat antes de fazê-lo, flatnão será mais a ferramenta certa. Por exemplo, se você o tiver atribuído, my @a = 1..5 Z 20..25;então flatsozinho não fará o trabalho. Eu achataria assim my %h = @a[*;*];. Eu escrevi um pouco mais sobre o uso de subscritos para achatar dados em vários níveis aqui .
raiph 28/03
@ralph, o que dizer ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(isto é, o resultado final seria um hash com listas como valores)?
vonbrand 29/03