Jak przekształcić listę 2-elementową w hasz?

9

Mam listę dwuelementowych list, takich jak to, co otrzymujesz na przykład (1..5) Z (20..24), które chcę przekształcić w skrót (w tym przykładzie, co otrzymujesz {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Mógłbym to zrobić „ręcznie”, ale to nie jest nie jest zbyt elegancki i jestem pewien, że Raku ma idiomatyczny sposób na zrobienie tego.

my @a = (1..5) Z (20..24);
my %a;
for @a -> @x {
   %a{@x[0]} = @x[1];
vonbrand
źródło

Odpowiedzi:

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

ZMeta-operator wykonuje operator jako część nazwy, a to domyślnie ,, tworząc listy domyślnie. Jeśli dodasz Pairkonstruktor (aka fat-przecinek), to utworzysz listę Pairs, którą możesz dodać do pliku Hash.

Alternatywnym rozwiązaniem byłoby flatdziesięć w wyniku Z:

my %h = flat (1..5) Z (20..24);
Elizabeth Mattijsen
źródło
1
W tym konkretnym przykładzie działa to dobrze. Ale co, jeśli mam listę dwóch elementów w jakiś sposób?
vonbrand
1
Wtedy druga opcja flatpowinna działać.
Elizabeth Mattijsen
1
@vonbrand Strategia spłaszczania jest w pełni ogólna. flatspłaszczy wiele poziomów wielopoziomowej struktury danych, jeśli są to poziomy Lists. Ale jeśli już wprowadziłeś elementy inne niż Listnp. Przypisywanie danych Arraybez użycia flat przed zrobieniem tego, to flatnie będzie już właściwym narzędziem. Na przykład, jeśli przypisałeś to za pomocą, my @a = 1..5 Z 20..25;wtedy flatsam nie wykona zadania. Spłaszczyłbym to w ten sposób my %h = @a[*;*];. Napisałem nieco więcej na temat używania indeksów dolnych do spłaszczania danych wielopoziomowych tutaj .
raiph
@ralph, a co z ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(tzn. wynikiem końcowym byłby skrót z listami jako wartości)?
vonbrand