我将有一个数字列表,每个都在各自的行(比如0 -100)。如何找到未列出或缺失的数字?
答案 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
}
'
答案 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