Come fare un elenco di elenchi a 2 elementi in un hash?


9

Ho un elenco di elenchi a due elementi, come quello che otterresti, ad esempio (1..5) Z (20..24), che voglio trasformare in un hash (in questo esempio, ciò che riesci a ottenere {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Potrei farlo "a mano", ma non è è troppo elegante e sono sicuro che Raku abbia un modo idiomatico di farlo. L'alternativa non elegante che mi viene in mente è:

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

Risposte:


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

Il Zmeta-operatore prende un operatore come parte del suo nome e lo fa di default ,, creando così liste di default. Se aggiungi il Paircostruttore (aka fat-virgola), crei un elenco di Pairs, che puoi inserire in a Hash.

Una soluzione alternativa sarebbe quella di flatdieci il risultato di Z:

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

1
Per questo esempio particolare, funziona benissimo. E se avessi in qualche modo la lista delle liste a due elementi?
vonbrand,

1
Quindi la seconda opzione che utilizza flatdovrebbe funzionare.
Elizabeth Mattijsen,

1
@vonbrand La strategia di appiattimento è del tutto generale. flatappiattirà più livelli di una struttura di dati multilivello se i livelli sono Lists. Ma se hai già introdotto non- Lists, ad es. Assegnando i dati a un Arraysenza utilizzarlo flat prima di farlo, allora flatnon sarà più lo strumento giusto. Ad esempio, se lo hai assegnato usando my @a = 1..5 Z 20..25;allora flatda solo non farà il lavoro. Lo appiattirei in questo modo my %h = @a[*;*];. Ho scritto un po 'di più sull'uso dei pedici per appiattire i dati a più livelli qui .
Raiph,

@ralph, che dire ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(ovvero, il risultato finale sarebbe un hash con liste come valori)?
vonbrand
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.