我有一个间隔列表(大约42000)和一个值数组(几百万),我想从每个间隔的较长值列表中获取值。
是否有方法(或模块)我可以直接在每个区间内提取值,而不是循环遍历所有值,并与每个区间的循环内的区间进行比较。这非常耗时。
例如:
foreach my $read_pos ( keys %{ $reads{$chr} } ) { #$reads{$chr} is the list of all values
if ( ( $read_pos >= $utr_start ) && ( $read_pos <= $utr_end ) ) { #$utr_start and $utr_end are intervals
push( @{ $reads_tsx{$acc} }, $read_pos );
}
}
答案 0 :(得分:4)
只需使用slice
:
@reads_tsx = @reads[$utr_start, $utr_end];
示例:
@nums = (1..200);
@slicenums = @nums[10..20];
print "@slicenums";
结果:
11 12 13 14 15 16 17 18 19 20 21
如果您想要多个间隔,也可以:
@nums = (1..200);
@slicenums = @nums[10..15,50..55,140..145];
print "@slicenums";
结果:
11 12 13 14 15 16 51 52 53 54 55 56 141 142 143 144 145 146
如果您有哈希,而不是列表:
%vals = (
10 => "s10",
30 => "s30",
50 => "s50",
);
@nums = (0..200);
@slicenums = grep { exists($vals{$_}) } @nums[10..15,50..55,140..145];
print "@slicenums\n";
print "@vals{@slicenums}\n";
结果:
$ perl 1.pl
10 50
s10 s50
此处s10
和s50
是获取间隔的密钥的对应值:10..15,50..55,140..145
答案 1 :(得分:0)
使用区间树数据结构