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];

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);

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.