代码之家  ›  专栏  ›  技术社区  ›  Kelly Bundy

保留两侧有三个或三个以上的列表元素

  •  -1
  • Kelly Bundy  · 技术社区  · 11 月前

    我们如何才能只保留两边有三个或三个以上元素的元素?例如:

    [1, 2, 3, 4]  =>  [1, 4]
    
    • 这个 1 右边有三个元素,所以我们保留它。

    • 这个 2 3 每一个边上只有一个或两个元素,所以我们删除它们。

    • 这个 4 左边有三个元素,所以我们保留了它。

    更多示例:

    []  =>  []
    [1]  =>  []
    [1, 2]  =>  []
    [1, 2, 3]  =>  []
    [1, 2, 3, 4]  =>  [1, 4]
    [1, 2, 3, 4, 5]  =>  [1, 2, 4, 5]
    [1, 2, 3, 4, 5, 6]  =>  [1, 2, 3, 4, 5, 6]
    [1, 2, 3, 4, 5, 6, 7]  =>  [1, 2, 3, 4, 5, 6, 7]
    

    编辑:如果有人真的介意我没有提供任何“尝试”,这里有一个糟糕的方法:

    L = [1, 2, 3, 4]
    
    N = len(L)
    for i in reversed(range(N)):
        left = i
        right = N - 1 - i
        if not (left >= 3 or right >= 3):
            L.pop(i)
    
    print(L)
    
    3 回复  |  直到 11 月前
        1
  •  3
  •   Julien    11 月前

    就这么简单?

    def f(L):
        if len(L) < 4:
            return []
        elif len(L) == 4:
            return [L[0], L[3]]
        elif len(L) == 5:
            return [L[0], L[1], L[3], L[4]]
        else:
            return L
    
    Ls = [
        [],
        [1],
        [1, 2],
        [1, 2, 3],
        [1, 2, 3, 4],
        [1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5, 6],
        [1, 2, 3, 4, 5, 6, 7]
    ]
    
    for L in Ls:
        print(f(L))
    
        2
  •  2
  •   Julien    11 月前
    def f(L, n=3):
        L = L[:]
        del L[-n:n]
        return L
    
    Ls = [
        [],
        [1],
        [1, 2],
        [1, 2, 3],
        [1, 2, 3, 4],
        [1, 2, 3, 4, 5],
        [1, 2, 3, 4, 5, 6],
        [1, 2, 3, 4, 5, 6, 7]
    ]
    
    for L in Ls:
        print(f(L))
    

    基于Julien的代码进行测试输出。

        3
  •  2
  •   Andrej Kesely    11 月前
    lst = [1, 2, 3, 4, 5]
    
    N = 3
    out = [v for i, v in enumerate(lst) if N <= i or i < len(lst) - N]
    print(out)
    

    打印:

    [1, 2, 4, 5]