代码之家  ›  专栏  ›  技术社区  ›  My Car

如何在Python中的列表中找到两个元素之间缺少的元素?

  •  2
  • My Car  · 技术社区  · 3 年前

    我的清单如下:

    ['1', '5', '6', '7', '10']
    

    我想在上面列表中的两个元素之间找到缺失的元素。例如,我想获取之间缺少的元素 '1' 和 '5' ,即。 '2' , '3' 和 '4' 。另一个例子是,在 '5' 和 '6' ,所以它不需要返回任何内容。

    根据上面的列表,我希望它返回这样的列表:

    ['2', '3', '4', '8', '9']
    

    我的代码:

    # Sort elements in a list
    input_list.sort()
    
    # Remove duplicates from a list
    input_list = list(dict.fromkeys(input_list))
    

    如何返回上述列表?如果有任何帮助,我将不胜感激。提前谢谢!

    5 回复  |  直到 3 年前
        1
  •  2
  •   OysterShucker    3 年前

    你可以使用的组合 range 和 set 并且完全跳过迭代。

    #original data
    data = ['1', '5', '6', '7', '10']
    
    #convert to list[int]
    L    = list(map(int, data))
    
    #get a from/to count
    R    = range(min(L), max(L)+1)
    
    #remove duplicates and convert back to list[str]
    out  = list(map(str, set(R) ^ set(L)))
    
    print(out)
    
        2
  •  2
  •   Dash    3 年前

    我会使用 range() 函数来生成丢失的数字,并可能使用 itertools.pairwise() 以便容易地与之前的数字进行比较。自Python 3.10以来, pairwise 比 zip(arr, arr[1:]) 因为成对是在C层中实现的,并且不复制列表。

    import itertools
    arr = ['1', '5', '6', '7', '10']
    
    new_arr = []
    
    for p, c in itertools.pairwise(arr):
        prev, curr = int(p), int(c)
        if (prev + 1) != curr:
            new_arr.extend([str(i) for i in range(prev + 1, curr)])
    
        3
  •  2
  •   wim    3 年前

    如果成对迭代,则很容易检测并填补空白:

    L = ['1', '5', '6', '7', '10']
    result = []
    for left, right in zip(L, L[1:]):
        left, right = int(left), int(right)
        result += map(str, range(left + 1, right))
    
        4
  •  2
  •   atru    3 年前

    如果性能不是问题,可以使用简单的嵌套 for 循环:

    input_list = ['1', '5', '6', '7', '10']
    
    missing_list = []
    
    for ind in range(0, len(input_list)-1):
    
        el_0 = int(input_list[ind])
        el_f = int(input_list[ind+1])
    
        for num in range(el_0 + 1, el_f):
            missing_list.append(str(num))
    

    以上假设数字是整数。不建议使用第一个循环——该循环使用列表的长度进行迭代,而不是像这样的构造 enumerate 。我在这里使用它是因为它很简单。

        5
  •  0
  •   Damzaky    3 年前

    使用经典for循环和 range() 方法以及对于一个线性风扇:

    arr = ['1', '5', '6', '7', '10']
    ans = []
    
    for i in range(len(arr) - 1): ans += map(str, list(range(int(arr[i]) + 1, int(arr[i + 1]))))
        
    print(ans)
    

    输出: ['2', '3', '4', '8', '9']