使用任何脚本语言查找范围内的缺失值 - Perl、Python或Shell脚本

7 投票
12 回答
4010 浏览
提问于 2025-04-15 22:06

我遇到了一个问题,就是在一系列数字中找出缺失的值,而这些数字的范围在每一行都是不一样的。

输入

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-

撰写回答