【问题标题】:Perl forming string random string combinationPerl 形成字符串随机字符串组合
【发布时间】:2012-06-14 23:07:09
【问题描述】:

我有一个包含大约 25000 条记录的文件,每条记录有超过 13 个条目是药物名称。我想为这些条目形成所有可能的配对组合。例如:如果一行有三个记录 A、B、C。我应该形成组合为 1) AB 2) AC 3)B C。下面是我从互联网上获得的代码,它仅适用于将单行分配给数组:

use Math::Combinatorics;

my @n = qw(a b c);
my $combinat = Math::Combinatorics->new(
  count => 2,
  data  => [@n],
);

while ( my @combo = $combinat->next_combination ) {
  print join( ' ', @combo ) . "\n";
}

我正在使用的代码,它不会产生任何输出:

open IN, "drugs.txt" or die "Cannot open the drug file";
open OUT, ">Combination.txt";

use Math::Combinatorics;

while (<IN>) {
  chomp $_;
  @Drugs = split /\t/, $_;
  @n = $Drugs[1];

  my $combinat = Math::Combinatorics->new(
    count => 2,
    data  => [@n],
  );

  while ( my @combo = $combinat->next_combination ) {

    print join( ' ', @combo ) . "\n";
  }
  print "\n";
}

你能建议我解决这个问题吗?

【问题讨论】:

  • 你的代码标准太差了,我通过perltidy运行它已经大大改进了它。不熟悉编程不是草率和不一致布局的借口。

标签: perl


【解决方案1】:

您将 @n 设置为包含 @Drugs 数组的第二个值的数组,请尝试在 Math::Combinatorics 构造函数中仅使用 data =&gt; \@Drugs

另外,使用严格;使用警告;哈哈哈哈哈哈。

【讨论】:

  • ... 并使用三参数版本的打开和词法文件句柄 ... 适当的缩进 ... 不必要的使用 $_ ... 只是添加一些点。
【解决方案2】:

数组中的所有对都可以直接计算。使用您的问题中的药物 A、B 和 C,您可能会认为它们形成了一个方阵。

AA  AB  AC
BA  BB  BC
CA  CB  CC

您可能不想要“对角线”对 AA、BB 和 CC。请注意,其余元素是对称的。例如,元素 (0,1) 是 AB, (1,0) 是 BA。在这里,我再次假设这些是相同的,并且您不希望重复。

要从线性代数中借用一个术语,您需要upper triangle。这样做可以通过构造消除重复,假设给定行上的每个药物名称都是唯一的。下面是一个算法。

  1. 依次选择每种药物q就行了。对于其中的每一个,请执行第 2 步和第 3 步。
  2. 从紧跟在 q 之后的药物开始,然后对于列表其余部分中的每个药物 r,执行第 3 步。
  3. 记录对 (q, r)。
  4. 记录的列表是所有唯一对的列表。

在 Perl 中,这看起来像

#! /usr/bin/env perl

use strict;
use warnings;

sub pairs {
  my @a = @_;

  my @pairs;
  foreach my $i (0 .. $#a) {
    foreach my $j ($i+1 .. $#a) {
      push @pairs, [ @a[$i,$j] ];
    }
  }

  wantarray ? @pairs : \@pairs;
}

my $line = "Perlix\tScalaris\tHashagra\tNextium";
for (pairs split /\t/, $line) {
  print "@$_\n";
}

输出:

Perlix Scalaris
Perlix 哈希格拉
Perlix Nextium
斯卡拉里斯哈沙格拉
Scalaris Nextium
Hasagra Nextium

【讨论】:

    【解决方案3】:

    我以前为其他人回答过类似的问题。对于他们来说,他们有一个问题是如何将一个字母列表组合成所有可能的单词。

    看看How Can I Generate a List of Words from a group of Letters Using Perl。在其中,您将看到使用 my answer 中的 Math::Combinatoricsikegami 所具有的 correct answer 的示例。 (他用正则表达式做了一些相当有趣的事情)。

    我相信其中之一会引导您找到所需的答案。也许当我有更多时间时,我会专门针对您的问题来充实一个答案。我希望这个链接有帮助。

    【讨论】:

      猜你喜欢
      • 2014-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2011-06-30
      相关资源
      最近更新 更多