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.