【问题标题】:Trying to Use Perl to Join Two Arrays at each Element尝试使用 Perl 在每个元素处连接两个数组
【发布时间】:2013-08-29 06:33:00
【问题描述】:

我想在同一个元素处将两个数组连接在一起。例如,我想结合 $array1[0] 和 $array2[0] 等等。

@array1 = qw(A B C D)
@array2 = qw(a b c d)

@array3 = qw(A a B b C c D d)

我之前尝试过使用嵌入式循环,但这只是产生了错误的输出。

foreach my $liginfo_data_var (@liginfo_data)
{
    foreach my $ligands_data_var (@ligands_data)
    {
        print COMBLIG join ($liginfo_data_var, "\t", $ligands_data_var, "\n");

    }
}

我还没有在 StackOverflow 上找到答案,希望能听到一些建议。非常感谢!

【问题讨论】:

标签: arrays perl join


【解决方案1】:

这是一个直接来自 List::MoreUtils 文档的示例:

use List::MoreUtils 'pairwise';

@a = qw/a b c/;
@b = qw/1 2 3/;
@x = pairwise { ($a, $b) } @a, @b;  # returns a, 1, b, 2, c, 3

编辑:正如 ikegami 指出的,zip 是一个更好的解决方案:

use List::MoreUtils 'zip';

@a = qw/a b c/;
@b = qw/1 2 3/;
@x = zip @a, @b;  # returns a, 1, b, 2, c, 3

我运行了一个比较 zippairwise 和 amon 的 map 解决方案的基准测试,所有这些都返回一个新数组。 pairwise 是失败者:

             Rate pairwise      map      zip
pairwise 111982/s       --     -43%     -52%
map      196850/s      76%       --     -16%
zip      235294/s     110%      20%       --

【讨论】:

  • @ikegami 是的,刚刚发现zip 感谢@amon 的回答和在cmets 中链接到的@squiguy 的回答。在这种情况下,zip 不仅更容易阅读,而且速度也快了很多。感谢您的提示。
【解决方案2】:

(啊,这在 Perl6 中是多么容易:@array3 = @array1 Z @array2

不要直接迭代 元素。相反,并行循环两个数组的索引

for my $i ( 0 .. $#array1 ) {
  push @array3, $array1[$i], $array2[$i];
}

或者map:@array3 = map { $array1[$_], $array2[$_] } 0 .. $#array1

如果两个输入数组的长度相同,则此方法可以正常工作。你也可以use List::MoreUtils 'zip':@array3 = zip @array1, @array2

但您似乎不想创建@array3。如果您只想打印出这两个元素:

for my $i ( 0 .. $#array1 ) {
  say COMBLIG $array1[$i], "\t", $array2[$i];
}

请注意,我不必使用join。该函数将输入列表与某个分隔符连接起来,该分隔符作为第一个参数给出。例如。 join ', ', 1..3 产生 "1, 2, 3"

【讨论】:

  • 工作就像一个魅力!我最终使用了你的最后一个建议。非常感谢!
猜你喜欢
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多