使用任何脚本语言查找范围内的缺失值 - Perl、Python或Shell脚本
我遇到了一个问题,就是在一系列数字中找出缺失的值,而这些数字的范围在每一行都是不一样的。
输入
673 673 673 676 676 680 2667 2667 2668 2670 2671 2674
输出应该是这样的
674 675 677 678 679 2669 2672 2673
这只是其中的一部分,行中的数值可能会更多。如果你需要任何解释,请告诉我。
12 个回答
5
Perl:
use Modern::Perl;
for my $line (<DATA>) {
chomp $line;
my @numbers = split /\s+/, $line;
my ($min, $max) = (sort { $a <=> $b } @numbers)[0, -1];
my @missing = grep { not $_ ~~ @numbers } $min .. $max;
say join " ", @missing;
}
__DATA__
673 673 673 676 676 680
2667 2667 2668 2670 2671 2674
6
在Python中:
def report_missing_numbers(f):
for line in f:
numbers = [int(n) for n in line.split()]
all_numbers = set(range(numbers[0], numbers[-1]))
missing = all_numbers - set(numbers)
yield missing
注意:虽然叫做all_numbers
,但其实有点 misleading,因为这个范围不包括最后一个数字。不过因为这个数字一定在集合里,所以这并不影响算法的正确性。
注意:我把我原来的答案中的[-1]
去掉了,因为int(n)
不会在意后面多出来的'\n'
。
8
纯粹使用bash。
用两个子进程来运行一个diff
命令,然后整理一下结果。
diff <(cat my_range_with_holes) <(seq 1 1000) | grep '>' | cut -c 3-