Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何查找未列出或缺少的号码?_Python_Bash - Fatal编程技术网

Python 如何查找未列出或缺少的号码?

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]从中减

我会有一个数字列表,每个数字都有自己的一行(比如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]
缺失


在这方面,集合是相当有效的。作为一个额外的好处,重复的数据将被优雅地处理。

如果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