从变量列表列表中删除第N项

时间:2017-10-04 18:14:19

标签: python recursion

我正在试图找出一种Pythonic方法从列表的变量列表中删除第N项。

例如,我如何从一个方法中删除具有可变深度的列表中的最后一项,一个班轮,一些漂亮的东西?

example1 = [
    [
        [1,2,3],
        [4,5,6]
    ]
]

expected_output_1 = [
    [
        [1,2],
        [4,5]
    ]
]

example2 = [
    [
        [
            [
                [1,2,3],
                [4,5,6]
            ]
         ]
    ]
]

expected_output_2 = [
    [
        [
            [
                [1,2],
                [4,5]
            ]
         ]
    ]
]

感谢!!!

4 个答案:

答案 0 :(得分:1)

我不知道可以使用的单线程,因为进入最深的列表有点棘手。只要输入至少是列表列表,下面的底部函数将删除第n个元素。 (使用n=-1删除最后一个元素。)

from collections import Sequence
from itertools import chain, count

def depth(seq):
    for level in count():
        if not seq:
            return level
        seq = list(chain.from_iterable(s for s in seq if isinstance(s, Sequence)))

def remove_nth_from_deepest_list(lst, n):
    d = depth(lst)
    for _ in range(d - 2):
        lst = lst[0]
    for sublist in lst:
        del sublist[n]
    for _ in range(d - 2):
        lst = [lst]
    return lst

编辑:实际上,我的原始答案并没有以相同的深度返回列表。进行编辑,以使返回的列表与原始列表具有相同的深度,只需删除元素。

答案 1 :(得分:0)

For list in example1:
    list = list.del(len((list)-1))

我在手机上而不是我的电脑,所以我不能保证这样做。

答案 2 :(得分:0)

  

如果您想以一种简单的方式逐步理解它   它是如何工作的

这只是因为这个人想要一个解释并不是一个好的做法很难

    for x in l: #looping first time
        for x1 in x: #looping to flatten
            for x2 in x1: #looping again to flatten the set
                for x3 in x2: #last loop to get a proper set of list
                    del x3[len(x3)-1] # deleting the last one by subtracting with length
                    print(x3) # printing result
  

预期输出l = [[[[[1,2,3],[4,5,6]]]]]

     
    

[1,2] [4,5]

  

答案 3 :(得分:0)

首先,我们使用递归函数来确定列表嵌套的深度,然后我们使用简单的循环来降低我们想要修剪的级别,使用切片分配从每个最里面的子列表中删除最后一项。

example0 = [[1, 2, 3]]

example1 = [
    [
        [1,2,3],
        [4,5,6]
    ]
]

example2 = [
    [
        [
            [
                [1,2,3],
                [4,5,6]
            ]
         ]
    ]
]

def list_depth(seq, depth=0):
    if isinstance(seq, list):
        return list_depth(seq[0], depth + 1)
    return depth

for seq in (example0, example1, example2):
    print('original:', seq)
    t = seq
    for i in range(list_depth(seq) - 2):
        t = t[0]
    t[:] = [u[:-1] for u in t]
    print('trimmed: ', seq, '\n')

<强>输出

original: [[1, 2, 3]]
trimmed:  [[1, 2]] 

original: [[[1, 2, 3], [4, 5, 6]]]
trimmed:  [[[1, 2], [4, 5]]] 

original: [[[[[1, 2, 3], [4, 5, 6]]]]]
trimmed:  [[[[[1, 2], [4, 5]]]]] 
相关问题