使用任何脚本语言 - perl,python或shell脚本查找范围中的缺失值

man*_*anu 7 python bash shell perl

我遇到了一个在一个范围内找到缺失值的问题,并且该范围对于连续的行也是可变的.

输入

673 673 673 676 676 680
2667 2667 2668 2670 2671 2674

输出应该是这样的

674 675 677 678 679
2669 2672 2673

这只是一个部分,行值也可以更多如果您需要任何澄清,请告诉我.

owe*_*tin 8

纯粹的bash.

使用两个子shell并运行a diff,然后清理结果.

diff <(cat my_range_with_holes) <(seq 1 1000) | grep '>' | cut -c 3-
Run Code Online (Sandbox Code Playgroud)


Mar*_*tos 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
Run Code Online (Sandbox Code Playgroud)

注意: all_numbers有点谎言,因为范围不包括最终数字,但由于该数字保证在集合中,因此不会影响算法的正确性.

注意:[-1]从原来的答案中删除了,因为int(n)不关心尾随'\n'.


dra*_*tun 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
Run Code Online (Sandbox Code Playgroud)


bal*_*pha 2

Python:

for line in open("inputfile.txt"):
    vals = set(map(int, line.split()))
    minv, maxv = min(vals), max(vals)
    missing = [str(v) for v in xrange(minv + 1, maxv) if v not in vals]
    print " ".join(missing)
Run Code Online (Sandbox Code Playgroud)