Склейте список на основе значения - PullRequest
0 голосов
/ 31 октября 2018

А есть список значений. Я хочу удалить вхождение определенного значения из списка и вставить несколько значений, где оно было ранее (значение встречается ровно один раз). То же самое в коде:

values = [1, 2, 3, 4, 5]
index = values.index(3)
values[index:index+1] = ['a', 'b', 'c']
# values == [1, 2, 'a', 'b', 'c', 4, 5]

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

Вот лучший код, который я придумал:

def splice_by_value(iterable, to_remove, *to_insert):
    for item in iterable:
        if item == to_remove:
            for insert in to_insert:
                yield insert
        else:
            yield item

Я использую Python 3.7.

1 Ответ

0 голосов
/ 31 октября 2018

Самый питонский способ сделать это, какой я мог найти, это:

values = [1, 2, 3, 4, 5]
value = 3
replace = ['a', 'b', 'c']
def splice(values, value, replace):
    result = [replace if x == value else x for x in values]

Где вы можете просто выбрать, какое значение заменить и чем. Это, однако, в неплоский список. Если вам нужна квартира, это может быть полезно (взято из здесь ):

def flat_gen(x):
    def iselement(e):
        return not(isinstance(e, Iterable) and not isinstance(e, str))
    for el in x:
        if iselement(el):
            yield el
        else:
            for sub in flat_gen(el): yield sub

Так что, если вы используете что-то вроде:

result_flat = list(flat_gen(result))

Он должен работать как положено.

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