Циклический просмотр списка и вложенных списков в python - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь добавить префикс в список строк в Python. Список строк может содержать несколько уровней вложенных списков.

Есть ли способ l oop через этот список (и его вложенные списки) при сохранении структуры?

вложенные циклы for стали нечитаемыми очень быстро и, похоже, не быть правильным подходом ..

list = ['a', 'b', ['C', 'C'], 'd', ['E', ['Ee', 'Ee']]]

for i in list:
        if isinstance(i, list):
                for a in i:
                        a = prefix + a
                        #add more layers of for loops
        else:
                i = prefix + i

желаемый результат:

prefix = "#"
newlist = ['#a', '#b', ['#C', '#C'], '#d', ['#E', ['#Ee', '#Ee']]]

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 10 января 2020

Вы можете написать простую рекурсивную функцию

def apply_prefix(l, prefix):
    # Base Case
    if isinstance(l, str):
        return prefix + l
    # Recursive Case
    else:
        return [apply_prefix(i, prefix) for i in l]


l = ['a', 'b', ['C', 'C'], 'd', ['E', ['Ee', 'Ee',]]]

print(apply_prefix(l, "#"))
# ['#a', '#b', ['#C', '#C'], '#d', ['#E', ['#Ee', '#Ee']]]
1 голос
/ 10 января 2020

Это будет использовать рекурсию:

a = ['a', 'b', ['C', 'C'], 'd', ['E', ['Ee', 'Ee',]]]


def insert_symbol(structure, symbol='#'):
    if isinstance(structure, list):
        return [insert_symbol(sub_structure) for sub_structure in structure]
    else:
        return symbol + structure

print(insert_symbol(a))

>>> ['#a', '#b', ['#C', '#C'], '#d', ['#E', ['#Ee', '#Ee']]]
0 голосов
/ 10 января 2020

Возможно, вы можете использовать функцию, чтобы сделать это рекурсивно.

list_example = ['a', 'b', ['C', 'C'], 'd', ['E', ['Ee', 'Ee']]]

def add_prefix(p_list, prefix):
    for idx in range(len(p_list)):
        if isinstance(p_list[idx], list):
            p_list[idx] = add_prefix(p_list[idx], prefix)
        else:
            p_list[idx] = prefix + p_list[idx]
    return p_list

add_prefix(list_example, '#')

edit: теперь я вижу, что кто-то опубликовал почти то же самое.

btw. Называть список списками считается плохой практикой, поскольку в python это также типовое имя. Может привести к нежелательному поведению

0 голосов
/ 10 января 2020

Вы можете использовать рекурсивный код, подобный этому !, попробуйте, и если у вас есть вопросы, вы можете задать мне

def add_prefix(input_list):
    changed_list = []
    for elem in input_list:
        if isinstance(elem, list):
            elem = add_prefix(elem)
            changed_list.append(elem)
        else:
            elem = "#" + elem
            changed_list.append(elem)
    return changed_list
...