Comment transformer une liste de listes à 2 éléments en hachage?

9

J'ai une liste de listes à deux éléments, comme ce que vous obtiendrez par exemple (1..5) Z (20..24), que je veux transformer en hachage (dans cet exemple, ce que vous obtenez {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Je pourrais le faire "à la main", mais ce n'est pas pas trop élégant, et je suis sûr que Raku a une façon idiomatique de le faire. L'alternative inélégante que je propose est:

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

Réponses:

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

Le Zméta-opérateur prend un opérateur dans son nom, et il prend par défaut la valeur ,, créant ainsi des listes par défaut. Si vous ajoutez le Pairconstructeur (alias fat-virgule), vous créez une liste de Pairs, que vous pouvez alimenter dans a Hash.

Une solution alternative serait de flatdix le résultat de Z:

my %h = flat (1..5) Z (20..24);
Elizabeth Mattijsen
la source
1
Pour cet exemple particulier, cela fonctionne bien. Mais que se passe-t-il si j'obtiens la liste des listes à deux éléments autrement?
vonbrand
1
Ensuite, la deuxième option utilisant flatdevrait fonctionner.
Elizabeth Mattijsen
1
@vonbrand La stratégie d'aplatissement est entièrement générale. flataplatira plusieurs niveaux d'une structure de données à plusieurs niveaux si les niveaux sont Lists. Mais si vous avez déjà introduit des non- Lists, par exemple en affectant les données à un Arraysans les utiliser flat avant de le faire, alors flatce ne sera plus le bon outil. Par exemple, si vous l'avez attribué en utilisant my @a = 1..5 Z 20..25;alors flatseul ne fera pas le travail. Je voudrais l'aplatir comme ça my %h = @a[*;*];. J'ai écrit un peu plus sur l'utilisation des indices pour aplatir les données à plusieurs niveaux ici .
raiph
@ralph, qu'en est-il ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(par exemple, le résultat final serait un hachage avec des listes en tant que valeurs)?
vonbrand