изменить все значения списка неизвестной начальной формы - PullRequest
0 голосов
/ 02 марта 2019

я хочу изменить все элементы в списке с неизвестной начальной формой, поэтому я сделал эту вспомогательную функцию, но есть ли лучший (более короткий) способ или встроенный способ сделать это?

а также еще один вопрос на стороне, где лучше всего хранить такую ​​функцию>, если <нет встроенной функции, вместо копирования вставьте ее в каждый файл или проект <br>

def getNextList():
    yield [1]
    yield [[1,2],3]
    yield [[1,2,[3]], [4,5],6]

def change(next_list, function):
    for i, e in enumerate(next_list):
        if(isinstance(e, int)):
            next_list[i] = function(next_list[i])
        else: change(e, function)

for next_list in getNextList():
    change(next_list, lambda x: x+1)
    print(next_list)

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

 [2] 
 [[2, 3], 4] 
 [[2, 3, [4]], [5, 6], 7]

Редактировать: @Colin Schoen не является дубликатом вашего вопроса с тегами, потому что повторение дважды приведет к ошибке

Я думаю, решение, которое я выложилили версия @blhsing, которая действительно короче, является единственной для этой конкретной проблемы, но если я ее придерживаюсь, какой способ будет использовать эту функцию в разных проектах, не дублируя ее?

1 Ответ

0 голосов
/ 02 марта 2019

Вместо этого вы можете change вернуть выражение генератора, чтобы оно могло использовать возвращаемое значение рекурсивного вызова:

def change(next_list, function):
    return (list(change(e, function)) if isinstance(e, list) else function(e) for e in next_list)

, чтобы:

for changed_list in change(getNextList(), lambda x: x+1):
    print(changed_list)

вывод:

[2]
[[2, 3], 4]
[[2, 3, [4]], [5, 6], 7]

Что касается вашей второй части вопроса, вы можете сохранить эту функцию в отдельном модуле, например utils.py, внутри каталога, который является частью вашей переменной окружения PYTHONPATH,так что любой ваш проект может просто сделать from utils import change, чтобы сделать эту функцию доступной в пространстве имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...