【发布时间】:2013-12-21 11:05:44
【问题描述】:
【问题讨论】:
-
这个问题有个概括!参考问题:stackoverflow.com/questions/3492302/…
标签: python
【问题讨论】:
标签: python
>>> a=[1,2,3,4,5,7,8,9,10]
>>> sum(xrange(a[0],a[-1]+1)) - sum(a)
6
或者(使用 AP 级数之和公式)
>>> a[-1]*(a[-1] + a[0]) / 2 - sum(a)
6
对于可能缺少多个数字的一般情况,您可以制定 O(n) 方法。
>>> a=[1,2,3,4,7,8,10]
>>> from itertools import imap, chain
>>> from operator import sub
>>> print list(chain.from_iterable((a[i] + d for d in xrange(1, diff))
for i, diff in enumerate(imap(sub, a[1:], a))
if diff > 1))
[5, 6, 9]
【讨论】:
How to find missing number 而不是How to find amissing numbers
这应该可行:
a = [1, 3, 4, 5, 7, 8, 9, 10]
b = [x for x in range(a[0], a[-1] + 1)]
a = set(a)
print(list(a ^ set(b)))
>>> [2, 6]
【讨论】:
set() 转换时会对性能产生什么影响。遗憾的是,^ 运算符仅适用于集合,因此即使知道列表实际上是集合(尽管存储为列表),也需要进行转换。
1 + 2 + 3 + ... + (n - 1) + n = (n) * (n + 1)/2
所以缺少的数字是:
(a[-1] * (a[-1] + 1))/2 - sum(a)
【讨论】:
set(range(a[len(a)-1])[1:]) - set(a)
取所有数字的集合减去给定的集合。
【讨论】:
range(a[0],a[-1]+1) ?
+1 并不重要。但我认为range(1,a[-1]) 更清楚。
a=[1, 2, 4, 99]。你的方法可以适当地处理这个问题。
还有一个itertools方式:
from itertools import count, izip
a=[1,2,3,4,5,7,8,9,10]
nums = (b for a, b in izip(a, count(a[0])) if a != b)
next(nums, None)
# 6
【讨论】:
这将处理缺少第一个或最后一个数字的情况。
>>> a=[1,2,3,4,5,7,8,9,10]
>>> n = len(a) + 1
>>> (n*(n+1)/2) - sum(a)
6
【讨论】:
如果列表中有很多缺失的数字:
>>> a=[1,2,3,4,5,7,8,10]
>>> [(e1+1) for e1,e2 in zip(a, a[1:]) if e2-e1 != 1]
[6, 9]
【讨论】:
e2-e1 != 1
a=[1,2,3,4,5,8,10]
def find(arr):
for x in range(0,len(arr) -1):
if arr[x+1] - arr[x] != 1:
print arr[x] + 1
【讨论】:
上述问题的简单解决方案,它还找到了多个缺失的元素。
a = [1,2,3,4,5,8,9,10]
missing_element = []
for i in range(a[0], a[-1]+1):
if i not in a:
missing_element.append(i)
print missing_element
o/p: [6,7]
【讨论】:
这是在列表中查找缺失数字的简单逻辑。
l=[-10,-5,2,4,5,9,20]
s=l[0]
e=l[-1]
x=sorted(range(s,e+1))
l_1=[]
for i in x:
if i not in l:
l_1.append(i)
print(l_1)
【讨论】:
def findAllMissingNumbers(a):
b = sorted(a)
return list(set(range(b[0], b[-1])) - set(b))
【讨论】:
L=[-5,1,2,3,4,5,7,8,9,10,13,55]
missing=[]
for i in range(L[0],L[-1]):
if i not in L:
missing.append(i)
print(missing)
【讨论】:
一种简单的列表理解方法,适用于多个(非连续)缺失数字。
def find_missing(lst):
"""Create list of integers missing from lst."""
return [lst[x] + 1 for x in range(len(lst) - 1)
if lst[x] + 1 != lst[x + 1]]
【讨论】:
@Abhiji 提供了一个完美的解决方案。我想通过定义粒度值的选项来扩展他的答案。如果应该检查列表是否缺少value > 1,这可能是必要的:
from itertools import imap, chain
from operator import sub
granularity = 3600
data = [3600, 10800, 14400]
print list(
chain.from_iterable(
(data[i] + d for d in xrange(1, diff) if d % granularity == 0)
for i, diff in enumerate(imap(sub, data[1:], data))
if diff > granularity
)
)
上面的代码将产生以下输出:[7200]。
由于这段代码使用了很多嵌套函数,我还想提供一个快速的回溯参考,这有助于我理解代码:
【讨论】:
对于非常大的列表效率较低,但这是我的 Sum 公式版本:
def missing_number_sum(arr):
return int((arr[-1]+1) * arr[-1]/2) - sum(arr)
【讨论】:
如果范围已知并给出列表,则以下方法将起作用。
a=[1,2,3,4,5,7,8,9,10]
missingValues = [i for i in range(1, 10+1) if i not in a]
print(missingValues)
# o/p: [6]
【讨论】:
set(range(1,a[-1])) | set(a)
计算两个集合的并集。
【讨论】:
我使用了索引位置。 这样我比较索引和值。
a=[0,1,2,3,4,5,7,8,9,10]
for i in a:
print i==a.index(i)
【讨论】: