Bagaimana cara membuat daftar daftar 2-elemen menjadi hash?

9

Saya memiliki daftar daftar dua elemen, seperti apa yang akan Anda dapatkan misalnya dengan (1..5) Z (20..24), yang ingin saya buat menjadi hash (dalam contoh ini, apa yang Anda dapatkan {1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}. Saya bisa melakukannya "dengan tangan", tetapi itu tidak terlalu elegan, dan saya yakin Raku memiliki cara idiomatis untuk melakukannya. Alternatif lain yang saya buat adalah:

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

Jawaban:

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

The Zmeta-Operator mengambil operator sebagai bagian dari namanya, dan default untuk ,, sehingga membuat daftar secara default. Jika Anda menambahkan Pairkonstruktor (alias fat-koma), maka Anda membuat daftar Pairs, yang dapat Anda masukkan menjadi Hash.

Solusi alternatif adalah dengan flatsepuluh hasil dari Z:

my %h = flat (1..5) Z (20..24);
Elizabeth Mattijsen
sumber
1
Untuk contoh khusus ini, ini berfungsi dengan baik. Tetapi bagaimana jika saya mendapatkan daftar daftar dua elemen, entah bagaimana?
vonbrand
1
Maka opsi kedua menggunakan flatharus bekerja.
Elizabeth Mattijsen
1
@vonbrand Strategi perataan sepenuhnya umum. flatakan meratakan beberapa level dari struktur data multi-level jika levelnya Lists. Tetapi jika Anda sudah memperkenalkan non- Lists, mis. Menugaskan data ke Arraytanpa menggunakan flat sebelum melakukannya, maka flattidak akan lagi menjadi alat yang tepat. Misalnya, jika Anda menugaskannya menggunakan my @a = 1..5 Z 20..25;itu flatsendiri tidak akan melakukan pekerjaan. Saya akan meratakannya seperti ini my %h = @a[*;*];. Saya telah menulis sedikit lebih banyak tentang menggunakan subskrip untuk meratakan data multi-level di sini .
raiph
@ralph, bagaimana dengan ((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(yaitu, hasil akhir akan menjadi hash dengan daftar sebagai nilai)?
vonbrand