Добавление 0 для каждого N чисел - список пониманий - PullRequest
0 голосов
/ 12 марта 2019

Я борюсь с list comprehensions.Мне нужно написать функцию, которая будет добавлять 0 для каждого N чисел.Функция выглядит следующим образом:

def makeSpace(list, space):
    list = [list.insert(i, 0) for i in list if ....]
    return list

Пример, я передаю makeSpace(list,2), и если мой список выглядел следующим образом: 1,2,3,4,5,6, то после функции должна возвращаться 1,2,0,3,4,0,5,6,0

Может кто-нибудь подсказатьмне, как это сделать?

PS: Если цикл for лучше для него, он может быть традиционным for loop Я нашел в вопросе duplicate что-то и изменить самостоятельно:

def fun(lst, space):
    i = space
    while i < len(lst):
        lst.insert(i, 0)
        i += space+ 1
    return lst

Но он не добавляет число в конце, например, для каждых 3 пробелов: [1, 2, 3, 0, 4, 5, 6] он должен также добавлять после 6 Что я должен изменить?

Ответы [ 2 ]

3 голосов
/ 12 марта 2019

Вы можете сделать что-то ужасное, как это:

>>> n = 2
>>> lst = 1,2,3,4,5,6
>>> [x for i in range(0, len(lst), n) for sub in (lst[i:i+n],(0,)) for x in sub]
[1, 2, 0, 3, 4, 0, 5, 6, 0]

Это трудно читать и менее эффективно, чем наивная реализация, использующая простой цикл for.Не используйте это.

гораздо лучше писать чистый, хорошо организованный код, а не пытаться без причины писать списки.Если версия со списком не кажется очевидной, то почти наверняка ее не стоит писать.Рассмотрим следующее решение:

>>> def chunk_list_by_n(lst, n):
...     for i in range(0, len(lst), n):
...         yield lst[i:i+n]
...
>>> def foo(lst, n):
...     result = []
...     for chunk in chunk_list_by_n(lst, n):
...         result.extend(chunk)
...         if len(chunk) == n:
...             result.append(0)
...     return result
...
>>> foo((1,2,3,4,5,6),2)
[1, 2, 0, 3, 4, 0, 5, 6, 0]

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

2 голосов
/ 12 марта 2019

Вот версия с простым циклом for и независимым счетчиком, который вы увеличиваете:

test = [1, 2, 3, 4, 5, 6]
idx = 1
new = []
for num in test: 
    new.append(num)
    if idx % 3 == 0:
        new.append(0)

    idx += 1 

print(new)
[1, 2, 3, 0, 4, 5, 6, 0]
...