在Perl中迭代所有哈希键组合

在Perl中迭代所有哈希键组合,perl,hash,key,Perl,Hash,Key,我想确定具有类似消费选择的客户,并提供以下购买数据,列出购买各种产品的客户: $product1 = qw/client1 client2 client3 client4/; $product2 = qw/client2 client4/; $product3 = qw/client3 client4/; $product4 = qw/client1 client5/; $product5 = qw/client1/; 我认为创建一个以产品为键、以客户为值的散列可能是一个好主意 %Purcha

我想确定具有类似消费选择的客户,并提供以下购买数据,列出购买各种产品的客户:

$product1 = qw/client1 client2 client3 client4/;
$product2 = qw/client2 client4/;
$product3 = qw/client3 client4/;
$product4 = qw/client1 client5/;
$product5 = qw/client1/;
我认为创建一个以产品为键、以客户为值的散列可能是一个好主意

%Purchase;
$Purchase{$product} = @clients;
现在,我需要比较所有可能的产品组合,看看是否有重叠的客户:

    my @overlapped12 = intersect($Purchase{$product1}, $Purchase{$product2}); # 2 products 
    my @overlapped13 = intersect($Purchase{$product1}, $Purchase{$product3}); # 2 products 
    [...]
    my @overlapped123 = intersect($Purchase{$product1}, $Purchase{$product2}, $Purchase{$product3); # 3 products
[...]
my @overlapped12345 = intersect($Purchase{$product1},$Purchase{$product2},$Purchase{$product3},$Purchase{$product4},$Purchase{$product5});
考虑到我有几十个产品要检查几十个客户机,这个迭代变得非常低效和非常缓慢。你能帮我改进一下这个计算吗

谢谢

您可以使用生成产品的所有子集并对其进行迭代。它看起来像这样(未经测试)


我认为,与其将产品作为密钥,不如将客户机作为密钥创建哈希,如下所示:

Clients = {
    Client1 => [product1, product2, product3, ...]
    Client2 => [product1, product2]
    Client3 => [product1, product2, product3, product4]
    Client4 => [product1]
    ...
}
通过这种方式,您可以轻松检查客户列表中是否有多个产品

现在你能做的就是

  • 拆分
    产品字符串并将客户推送到列表中

  • 对于每个产品字符串
    通过拆分将客户添加到此列表中

  • 然后使用来自的
    uniq
    函数从此列表中获取唯一值列表
  • 使用列表::MoreUtils qw(uniq)

    或者在获得客户端密钥时直接创建哈希,并在下次检查密钥是否存在


    在您找到的每个客户机上添加产品,这可以通过检查密钥是否存在来实现

    我确信
    $Purchase{$product}=@clients没有达到预期效果。无法将列表
    qw/client1 client2 client3/
    分配给标量
    $product
    。您必须指定一个标量值,例如引用
    [qw/../]
    ,或者使用数组
    @product
    。正如最后两条注释所暗示的那样,您永远不应该发布近似代码或您当场编写的代码来“描述”您的问题。始终使用与您遇到问题的代码相同的真实代码。
    Clients = {
        Client1 => [product1, product2, product3, ...]
        Client2 => [product1, product2]
        Client3 => [product1, product2, product3, product4]
        Client4 => [product1]
        ...
    }