如何找到未列出或缺失的数字?

时间:2011-07-01 06:30:41

标签: python bash

我将有一个数字列表,每个都在各自的行(比如0 -100)。如何找到未列出或缺失的数字?

4 个答案:

答案 0 :(得分:12)

将它们全部添加到一个集合中。然后从填充1-100的集合中减去。以下是0-9的示例:

>>> set(range(10)) - set([1, 4, 5, 6, 8, 2])
set([0, 9, 3, 7])
>>> 

我列出了[1, 4, 5, 6, 8, 2]。为了找出缺少0-9范围内的数字,我创建了一个全部为0-9的集合,然后从中减去了[1, 4, 5, 6, 8, 2]的集合。并且发现[0, 9, 3, 7]遗失了。

套装对此非常有效。作为额外的好处,重复将被优雅地处理。

答案 1 :(得分:1)

如果L是数字列表,那么

set(L).difference(xrange(101))

保存从xrange

创建一个集合
In [1]: L=[1, 4, 5, 6, 8, 2]

In [2]: timeit set(range(101)) - set(L)
10000 loops, best of 3: 21.7 µs per loop

In [3]: timeit set(L).symmetric_difference(range(101))
100000 loops, best of 3: 14.2 µs per loop

In [4]: timeit set(L).difference(range(101))
100000 loops, best of 3: 9.73 µs per loop

答案 2 :(得分:0)

这是使用关联(键值)数组的awk解决方案:

printf '%s\n' 1 4 5 6 8 2 |
awk -F " " -v first=0 -v last=9 '
BEGIN { 
  for(i=first; i<=last; i++) 
    array[i] = 0
}
{
  for(i=1;i<=NF;i++)
    array[$i] += 1
}
END {
  for (num in array)
    if (array[num] == 0) print num
}
'
  • 首先,我们创建一个数组,其中给定范围的所有数字都用作单个键,默认值为0。
  • 然后,每个输入数字都被awk作为数组的键处理,以便值增加1。
  • 最后,只有那些没有增加的键被打印,即值为0(因为它们在输入的数字范围内缺失)。

答案 3 :(得分:0)

击:

# first set up an array containing the whole range
declare -a nums
for i in {0..100}; do
  nums[$i]=1
done

# then read the file and remove the numbers from it
while read number; do
  unset nums[$number]
done < file.with.numbers

# the remaining array keys are the numbers not found in the file
for number in "${!nums[@]}"; do
  echo $number
done