合并列表列表

克里斯·H

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

[
    [ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章