Wie mache ich eine Liste von 2-Element-Listen zu einem Hash?

9

Ich habe eine Liste von Listen mit zwei Elementen, wie (1..5) Z (20..24)zum Beispiel, was Sie erhalten möchten, die ich in einen Hash umwandeln möchte (in diesem Beispiel, was Sie erhalten {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Ich könnte es "von Hand" tun, aber das ist es nicht Es ist nicht zu elegant, und ich bin sicher, Raku hat eine idiomatische Art, es zu tun. Die unelegante Alternative, die ich mir ausgedacht habe, ist:

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

Antworten:

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

Der ZMeta-Operator nimmt einen Operator als Teil seines Namens und verwendet standardmäßig " ,Listen", wodurch standardmäßig Listen erstellt werden. Wenn Sie den PairKonstruktor (auch bekannt als Fettkomma) hinzufügen , erstellen Sie eine Liste von Pairs, die Sie in eine eingeben können Hash.

Eine alternative Lösung wäre flatzehn das Ergebnis von Z:

my %h = flat (1..5) Z (20..24);
Elizabeth Mattijsen
quelle
1
In diesem Beispiel funktioniert dies einwandfrei. Aber was ist, wenn ich die Liste der Zwei-Elemente-Listen irgendwie anders habe?
vonbrand
1
Dann sollte die zweite Option flatfunktionieren.
Elizabeth Mattijsen
1
@vonbrand Die Abflachungsstrategie ist ganz allgemein. flatreduziert mehrere Ebenen einer mehrstufigen Datenstruktur, wenn die Ebenen Lists sind. Wenn Sie jedoch bereits Nicht- ListS eingeführt haben, z. B. die Daten einem zuzuweisen , Arrayohne sie flat zuvor zu verwenden , ist dies flatnicht mehr das richtige Werkzeug. Zum Beispiel, wenn Sie es zugewiesen haben mit my @a = 1..5 Z 20..25;dann flatallein wird nicht die Arbeit machen. Ich würde es so abflachen my %h = @a[*;*];. Ich habe hier etwas mehr über die Verwendung von Indizes geschrieben, um mehrstufige Daten zu reduzieren .
Raiph
@ralph, was ist mit ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(dh das Endergebnis wäre ein Hash mit Listen als Werten)?
vonbrand