我想在给定列表中找到缺失的数字。这里的问题是,当1不在列表中时,它将不会返回1作为缺少的数字之一。另一个是当列表无序时,并且1是列表中的最后一个数字,它将返回1作为缺少的数字之一。
try {
command.CommandText = sb.ToString();
returnValue = command.ExecuteNonQuery();
// Try this.
throw new Exception("See where this goes.");
return returnValue == 1;
} finally {
command.Dispose();
}
我想念什么?
答案 0 :(得分:2)
如果列表可以是无序的,请不要使用num_list[0]
和num_list[-1]
作为范围限制。改为使用min
和max
original_list = list(range(min(num_list), max(num_list)+1))
此外,可以从set
的返回值(列表/迭代器,取决于Python版本)直接构建range
。
编辑:如果您始终希望最小值1:
original_list = list(range(1, max(num_list)+1))
答案 1 :(得分:1)
这只是行不通,问题定义不明确。您根本无法从不遗漏的数字列表中知道哪些遗漏了 just 。
如果输入为[1,2,3]
,怎么说4
应该存在?如果输入为[]
,那么您一无所知。
OP的评论证实了这一点:
我不能仅以1开头,因为将从数据库中选择数字。这些是基于用户选择的号码。 1可能从一开始就不在列表中,我也不想将其从1开始。
您甚至都不知道您的示例中是否缺少1实际上是错误的。
该功能无法实现,必须是千里眼。
您需要创建一个以(number_list, minvalue, maxvalue)
作为参数的新函数,并弄清楚如何提供它们。
答案 2 :(得分:0)
这是做到这一点的一种方法。
def missing_numbers(num_list):
start = 1
end = num_list[len(num_list)-1]
missing_list = [item for item in range(start, end) if item not in num_list]
return missing_list
O / P
missing_numbers([1,2,5])
[3, 4]
答案 3 :(得分:0)
在您的约束下,我建议您确定一个开始值和结束值,并确保它们遵循这些规则,但似乎1-num_list
中的最大值会起作用
def missing_numbers(num_list):
return list(set(num_list) ^ set(range(1, max(num_list) + 1)))
这也可以通过itertools.filterfalse
from itertools import filterfalse
def missing_numbers(num_list):
return list(filterfalse(num_list.__contains__, range(1, max(num_list) + 1)))
修改
由于没有人能对OP想要的start
和end
提出充分的理由。我说,让该方法接受一个开始值和一个结束值。
from itertools import filterfalse
def missing_numbers(numbers, start = 1, end = None):
if not end:
end = max(numbers) + 1
if start >= end:
raise TypeError("End must be greater than start")
#I just prefer the readability of the filterfalse method over
#the set one, but use whatever fits your fancy
return list(filterfalse(numbers.__contains__, range(start, end)))