2 elemanlı listelerin bir karmasını nasıl listeleyebilirim?


9

Ben (1..5) Z (20..24)bir karma haline (bu örnekte, ne elde etmek istiyorum.) Örneğin, ne olsun gibi iki öğeli listelerin bir listesi var {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}, ama "elle" yapabilirim, ama bu değil Çok zarif ve eminim Raku bunu yapmanın deyimsel bir yoluna sahip.

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

Yanıtlar:


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

ZMeta-operatör adının bir parçası olarak bir operatör alır ve Bunu varsayılan ,böylece varsayılan olarak listeleri oluşturma. PairYapıcıyı (aka fat-virgül) eklerseniz, a'ya Pairbesleyebileceğiniz bir s listesi oluşturursunuz Hash.

Alternatif bir çözüm şu flatsonuca ulaşmak olacaktır Z:

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

1
Bu özel örnek için, bu iyi çalışıyor. Ama iki elemanlı listelerin listesini başka bir şekilde alırsam ne olur?
vonbrand

1
Sonra ikinci seçenek kullanarak flatçalışmalıdır.
Elizabeth Mattijsen

1
@vonbrand Düzleştirme stratejisi tamamen geneldir. flatdüzeyler Lists ise çok düzeyli bir veri yapısının birden çok düzeyini düzleştirir . Ancak, önceden olmayanları tanıttıysanız List, örneğin bunu Arraykullanmadan flat önce bir veriyi atamak, flatartık doğru araç olmayacaktır. Belirlediğiniz Örneğin, bu kullanarak my @a = 1..5 Z 20..25;daha sonra flatişi yapmayacağım yalnız. Böyle düzeltirim my %h = @a[*;*];. Burada çok seviyeli verileri düzleştirmek için abonelikleri kullanma hakkında biraz daha yazdım .
Mart'ta raiph

@ralph, ne olacak ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(yani, sonuç, değerleri değer olarak içeren bir karma olur)?
vonbrand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.