如何将2元素列表做成哈希表?


9

我有一个由两个元素组成的列表的列表,例如您想要通过(1..5) Z (20..24)哈希表生成的内容(在此示例中,您可以通过哈希表获取的内容{1 => 20, 2 => 21, 3 => 22, 4 => 23, 5 =>24}。我可以“手工”完成此操作,但这不是不太优雅,我敢肯定Raku会采用惯用的方式。我想出的优雅选择是:

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

Answers:


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

Z荟萃运营商需要运营商作为其名称的一部分,它默认为,,因此在默认情况下创建列表。如果添加Pair构造函数(aka逗号),则会创建一个Pairs 列表,您可以将其输入Hash

另一种解决方案是将flat以下结果取十Z

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

1
对于此特定示例,这可以正常工作。但是,如果我以其他方式获得了两元素列表的清单,该怎么办?
vonbrand

1
然后使用的第二个选项flat应该起作用。
伊丽莎白·马蒂森

1
@vonbrand扁平化策略是完全通用的。flat如果级别为Lists,则将展平多级数据结构的多个级别。但是,如果您已经引入了非List符号,例如在Array未使用flat flat就将数据分配给,那么它将不再是正确的工具。例如,如果您使用分配了它,my @a = 1..5 Z 20..25;那么flat仅凭此一项就无法完成。我会这样弄平它my %h = @a[*;*];。我写一点关于使用标拉平多层次的数据在这里
雷夫

@ralph,那又怎么样((1, (1, 2, 3)), (2, (5, 6)), (17, (3, 4, 5, 92, 31))(即,最终结果将是将列表作为值的哈希)?
vonbrand
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.