Как удалить вложенный список, который находится внутри вложенного списка в python?

#python #list #nested-lists

Вопрос:

Я хочу удалить весь вложенный список внутри вложенного списка. Что означает

 x = [['-e'], ['-d', ['-e'], '-d'], ['-c', ['-d', ['-e'], '-d'], '-c'], ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], ['-a', ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], '-a']]
 

Я хочу удалить вложенный список в индексе 1,2,3,4… и сделать его плоским списком. Чтобы было ясно, ниже приведены разделенные значения в списке.

 ['-e']
['-d', ['-e'], '-d']
['-c', ['-d', ['-e'], '-d'], '-c']
['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b']
['-a', ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], '-a']
 

Я хочу, чтобы это было

 [['-e'], ['-d', '-e', '-d'], ['-c', '-d', '-e', '-d', '-c'], ['-b', '-c', '-d', '-e', '-d', '-c', '-b'], ['-a', '-b', '-c', '-d', '-e', '-d', '-c', '-b', '-a']]

['-e']
['-d', '-e', '-d']
['-c', '-d', '-e', '-d', '-c']
['-b', '-c', '-d', '-e', '-d', '-c', '-b']
['-a', '-b', '-c', '-d', '-e', '-d', '-c', '-b', '-a']
 

И есть ли какой-либо способ получить ввод, как описано выше.

 for i in range(0,size):
        z = ['-{}'.format(alnum[size-i])]
        if alnum[size] != alnum[size-i]:
            x.append(z*2)
        else:
            x.append(z)
 

Это был фрагмент, который я использовал, чтобы получить этот список x.

Ответ №1:

С вспомогательной рекурсивной функцией для выравнивания вложенных подсписков вместе с пониманием списка:

 def nested_flatten(seq):
    # start with an empty list
    result = []
    
    # for each item in the sublist...
    for item in seq:
        # is item a list?
        if isinstance(item, list):
            # then extend the result with the flattened item
            result  = nested_flatten(item)
        else:
            # otherwise extend with the item itself
            result  = [item]
    return result

# invoke `nested_flatten` on each sublist
out = [nested_flatten(sub) for sub in x]
 

получить

 >>> out

[['-e'],
 ['-d', '-e', '-d'],
 ['-c', '-d', '-e', '-d', '-c'],
 ['-b', '-c', '-d', '-e', '-d', '-c', '-b'],
 ['-a', '-b', '-c', '-d', '-e', '-d', '-c', '-b', '-a']]
 

Комментарии:

1. Я начинающий, так что не могли бы вы объяснить это.’результат = nested_flatten(элемент)’

2. @GoAmeer030 Функция начинается с пустого списка. Затем проверяет каждый элемент в подсписке, например, ['-c', ['-d', ['-e'], '-d'], '-c'] . Если элемент не является списком (например, первым), он помещает его в result список как есть. Но если это список (например, второй ['-d', ['-e'], '-d'] ), то он называет себя! и эта процедура продолжается. Каждый вызов в конце возвращает список. Понимание списка в конце вызывает эту функцию для каждого элемента x .

3. @GoAmeer030 Если вы не очень хорошо знакомы с рекурсивными функциями, то я мог бы запутать вас еще больше… Извините, если это так, но в остальном я надеюсь, что это помогло…

Ответ №2:

python-преобразование списка списков или вложенного списка в плоский список

 def flattenNestedList(nestedList):
    ''' Converts a nested list to a flat list '''
    flatList = []
    # Iterate over all the elements in given list
    for elem in nestedList:
        # Check if type of element is list
        if isinstance(elem, list):
            # Extend the flat list by adding contents of this element (list)
            flatList.extend(flattenNestedList(elem))
        else:
            # Append the elemengt to the list
            flatList.append(elem)    
    return flatList

x = [['-e'], ['-d', ['-e'], '-d'], ['-c', ['-d', ['-e'], '-d'], '-c'], ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], ['-a', ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], '-a']]

for li in x:
    print(flattenNestedList(li))
 

выход:

 ['-e']
['-d', '-e', '-d']
['-c', '-d', '-e', '-d', '-c']
['-b', '-c', '-d', '-e', '-d', '-c', '-b']
['-a', '-b', '-c', '-d', '-e', '-d', '-c', '-b', '-a']
 

Ответ №3:

Этот код использует рекурсию для достижения того, что вам нужно.

 from copy import deepcopy

x = [
    ['-e'],
    ['-d', ['-e'], '-d'],
    ['-c', ['-d', ['-e'], '-d'], '-c'],
    ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'],
    ['-a', ['-b', ['-c', ['-d', ['-e'], '-d'], '-c'], '-b'], '-a']
]

temp_list = []
def delist(x):
    for i in x:
        if type(i) == list:
            delist(i)
        else:
            temp_list.append(i)

new_list = []
for item in x:
    delist(item)
    new_list.append(deepcopy(temp_list))
    temp_list.clear()

print('Resultant:', new_list)