¿Cómo hacer una lista de listas de 2 elementos en un hash?


9

Tengo una lista de listas de dos elementos, como lo que obtendrías, por ejemplo (1..5) Z (20..24), que quiero convertir en un hash (en este ejemplo, lo que obtienes {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Podría hacerlo "a mano", pero eso no es No es muy elegante, y estoy seguro de que Raku tiene una forma idiomática de hacerlo. La alternativa poco elegante que se me ocurre es:

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

Respuestas:


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

El Zmetaoperador toma un operador como parte de su nombre y, por defecto ,, crea listas por defecto. Si agrega el Pairconstructor (también conocido como coma de grasa), entonces crea una lista de Pairs, que puede alimentar a Hash.

Una solución alternativa sería flatdiez el resultado de Z:

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

1
Para este ejemplo en particular, esto funciona bien. Pero, ¿qué pasa si obtengo la lista de listas de dos elementos de alguna otra manera?
vonbrand

1
Entonces la segunda opción usando flatdebería funcionar.
Elizabeth Mattijsen

1
@vonbrand La estrategia de aplanamiento es totalmente general. flataplanará múltiples niveles de una estructura de datos multinivel si los niveles son Lists. Pero si ya ha introducido no- Lists, por ejemplo, asignar los datos a un Arraysin usar flat antes de hacerlo, entonces flatya no será la herramienta correcta. Por ejemplo, si ha asignado usando my @a = 1..5 Z 20..25;entonces flatpor sí sola no hará el trabajo. Lo aplanaría así my %h = @a[*;*];. He escrito un poco más sobre el uso de subíndices para aplanar datos de varios niveles aquí .
raiph

@ralph, ¿qué pasa ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(es decir, el resultado final sería un hash con listas como valores)?
vonbrand
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.