gpt4 book ai didi

perl - 合并列表列表的列表

转载 作者:行者123 更新时间:2023-12-01 15:20:47 25 4
gpt4 key购买 nike

我有一个列表列表,像这样:

[
[ 1, 2, 3 ],
[ 20, 30, 40, 50 ],
[ 11, 15, 17 ],
[ 20, 22, 25, 27 ],
[ 1, 5, 10 ],
[ 1, 100 ]
]

我想合并一个列表中的任何元素与另一个列表中的任何元素相匹配的内部列表。这也需要能够处理多个重叠(因此在上面的示例中,列表的 3 个将合并为一个)。所以在这种情况下,结果如下:

[
[ 1, 2, 3, 5, 10, 100 ], # 3 lists have been merged into one
[ 11, 15, 17 ], # Untouched due to no overlap
[ 20, 22, 25, 30, 40, 50 ], # 2 lists merged
]

是否有明显的算法或 Perl 模块可供使用?

最佳答案

以下是一个单 channel 解决方案,它使用数组引用来施展魔法。

对于 this algorithm通过 jaredor和其他解决方案,查看 perlmonks:how to find combine common elements of an array?

use strict;
use warnings;

use List::MoreUtils qw(uniq);

my @data = map {[split]} <DATA>;

my %group = ();
for my $array (@data) {
my @values = map {@$_} uniq map {$group{$_} || [$_]} @$array;
@group{@values} = (\@values) x @values;
}
@data = uniq values %group;

# Resort to make things pretty
@$_ = sort {$a <=> $b} @$_ for @data;

use Data::Dump;
dd @data;

__DATA__
1 2 3
20 30 40 50
11 15 17
20 22 25 27
1 5 10
1 100

输出:

(
[20, 22, 25, 27, 30, 40, 50],
[11, 15, 17],
[1, 2, 3, 5, 10, 100],
)

关于perl - 合并列表列表的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24079557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com