从列表中查找缺少的元素

时间:2018-07-20 02:48:49

标签: python python-3.x

我编写了这段代码是为了从给定列表中查找缺失的正整数,但在某些情况下,它仍返回None

例如,给定数组A = [2, 4, 1, 5],该函数应返回3,因为它是连续序列(1 2 3 4 5)中缺少的元素。

我在做什么错了?

def solution(A):
    i = 1
    while i<len(A):
        if i not in A:
            return i
        i += 1

6 个答案:

答案 0 :(得分:2)

您需要注意i < len(A)引起了一些问题。

给出以下示例:

A = [1, 2, 3, 5]

很明显,所需的答案是4,但是您的函数给出的是None。这是因为len(A) == 4,因此您的循环条件是i < 4,它实际上将i从1枚举为3。

由于您想找出丢失的号码,因此最好在i到达列表中最大的数字而不是列表的长度时停止循环,所以:

while i < max(A):

是正确的。

答案 1 :(得分:1)

似乎工作正常。这是另一种选择:

def solution(A):
    a = set(A)
    for i, _ in enumerate(A, 1):
        if i in a:
            continue
        return i

solution(A)
# 3

答案 2 :(得分:1)

如果使用range函数对列表进行排序或近似排序,则可以利用列表理解:

def solution(A):
    return [value for value in range(min(A),max(A)) if value not in A]

基本上,我们说的是从min的{​​{1}}值到A的{​​{1}}值开始的数字序列,如果有的话值不在原始max列表中,请返回这些值。这将返回多个缺失值,例如:

A

注意:您提到的是“正”整数,不确定是否是严格的要求,但这不能说明负值。

我认为我们可以对此做出解释:

A

例如:

>>> def solution(A):
...     return [value for value in range(min(A),max(A)) if value not in A]
...
A = [1, 2, 3, 4, 7, 8, 10]
>>> solution(A)
[5, 6, 9]
>>>
>>> A = [2, 4, 1, 5]
>>>
>>> solution(A)
[3]

答案 3 :(得分:0)

在循环中使用i += 1时,只会出现一个错误。如果A的长度为n,并且n中缺少A,但是n+1中存在A,则该函数将返回None。可以通过循环到len(a)+1来解决此问题。

def solution(A):
    length = len(A) + 1
    i = 1 
    while i < length:
        if i not in A:
            return i
        i += 1

根据您对缺失正整数的定义,可以通过一些数学运算来找到。

def solution(A):
    n = len(A) + 1
    list_sum = (n * (n+1)) / 2
    a_sum = sum(A)
    missing = list_sum - a_sum
    if missing != n:
        return missing

采用列表的长度,然后添加一个并将其定义为n。使用该方程求和连续的正整数并将其保存到list_sum中。找出A的总和。 list_suma_sum之差将是丢失的整数,因为我们保证只能丢失一个整数。为了保持函数的行为,如果丢失的数字以n结尾,那么我们知道没有丢失的数字,请返回None

答案 4 :(得分:0)

好吧,这是从列表中查找缺失元素的最佳方法。

SELECT
    products.id
    ,products.created_at_timestamp
    ,products.last_update_timestamp
    ,product_names.name 
    ,product_summaries.summary
    ,product_names.language
FROM
    products
INNER JOIN
    product_names ON product_names.product_id = products.id
INNER JOIN
    product_summaries ON product_summaries.product_id = products.id 
    AND product_summaries.language = product_names.language 

答案 5 :(得分:0)

查找缺失的数字

使用range(start, stop),我们可以建立一个已经包含所有数字的排序列表。现在,只需在列表中查找缺失的值即可。

我们的range将使用您列表中的较低值和较高值来制作。 range(min(A), max(A))

def solution(A):
    missings = []
    for n in range(min(A), max(A)): # Iterate over each number in the sorted and complete list.
        if n not in A: # If that number isn't in your list.
            missings.append(n)
    return missings

或作为一行列表中的列表内容:

def solution(A): return [n for n in range(min(A), max(A)) if n not in A]

示例:

>>> solution([1, 9, 4, 3, 11, 5, 7])
[2, 6, 8, 10]

查找非负缺失数字

但是您说的是“找到缺失的 整数” ,所以您不希望出现负数

只需将 min(A) range(min(A), max(A))部分更改为range( max(0, min(A)) , max(A))。< br /> max(0, min(A))将使用max为您提供介于0和较低实际值之间的较大数字,因此将负数替换为0。

示例:

>>> solution([-4, -5, 1, 9])
[0, 2, 3, 4, 5, 6, 7, 8]

在较低的非负数之后查找非负缺失数

但是如前所述,您只说过:“找到缺失的 阳性 整数” ,因此首先,我知道你不想要负面的东西。
但是,如果您只希望缺失(作为我的第一个想法)非负值(作为第二个想法)在较低的非负值之后< / strong>(新想法)?

容易!
只需将 min(A) range(min(A), max(A))部分更改为range( min([n for n in A if n >= 0]) , max(A))
min([n for n in A if n >= 0])将在列表中寻找较低的非负值。

示例:

>>> solution([-4, -5, 3, 9])
[4, 5, 6, 7, 8]