我有一个列表列表,像这样:
[
[ 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模块要使用?
下面是一个单遍解决方案,它使用数组引用做了一点魔术。
对于该算法通过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],
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句