Python 如何查找未列出或缺少的号码?
我会有一个数字列表,每个数字都有自己的一行(比如0-100)。如何查找未列出或缺少的号码?将它们全部添加到一个集合中。然后从一个充满1-100的集合中减去。以下是0-9的示例:Python 如何查找未列出或缺少的号码?,python,bash,Python,Bash,我会有一个数字列表,每个数字都有自己的一行(比如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]从中减
>>> 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]
缺失
在这方面,集合是相当有效的。作为一个额外的好处,重复的数据将被优雅地处理。如果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
下面是一个使用关联(键值)数组的
awk
解决方案:
printf“%s\n”1 4 5 6 8 2|
awk-F”“-v first=0-v last=9'
开始{
对于(i=first;ibash:
#首先设置一个包含整个范围的数组
声明-一个nums
因为{0..100}中的i;do
nums[$i]=1
完成
#然后读取文件并删除其中的数字
读数字的时候,做什么
未设置nums[$number]
完成
你有重复的数字吗?它们被分类了吗?这是家庭作业吗?:-)这是一个非常漂亮的解决方案。没有重复的数字,它们将被排序。不,这不是家庭作业:)如果需要排序的输出,只需将集合转储到排序的list@curious1那么这可能是你得到的最好答案,尽管这里的排序是不相关的。@Eli,有点离题。将xrange
而不是range
在集合构造函数中更有效,或者说在python 2.7中优化了它?您也可以使用difference
,symmetric\u difference
本质上是一个XOR
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
}
'
# 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