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];

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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.