我将会有一列数字,每个数字占据单独的一行(比如0-100)。我该如何找到没有被列出或者缺失的数字?
将它们全部添加到一个集合中。然后从填充了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]
缺失了。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
difference
,symmetric_difference
本质上是一个XOR。 - Eli Benderskyprintf '%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
}
'
bash:
# 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