Вставить элемент в список Python после каждого n-го элемента

Скажем, у меня есть список Python:

letters = ['a','b','c','d','e','f','g','h','i','j'] 

Я хочу вставить «x» после каждого n-го элемента, скажем, трех символов в этом списке. Результат должен быть:

 letters = ['a','b','c','x','d','e','f','x','g','h','i','x','j'] 

Я понимаю, что могу сделать это с помощью цикла и вставки. То, что я на самом деле ищу, – это Pythonish-way, может быть, один лайнер?

  • Понимание стиля вызова by-by-Python передаваемых аргументов функции
  • Mercurial CGI (hgweb.cgi) не работает
  • Как я могу изменить язык администратора Django?
  • Назначить действие переменной в Automator для использования в Shell Script
  • Как назначить IP-адрес интерфейсу в python?
  • Линейные дроссели на 0x1A
  • Django form - set label
  • Python добавляет новый элемент в словарь
  • 6 Solutions collect form web for “Вставить элемент в список Python после каждого n-го элемента”

    У меня есть два лайнера.

    Данный:

     >>> letters = ['a','b','c','d','e','f','g','h','i','j'] 
    1. Используйте enumerate для получения индекса, добавьте 'x' каждую 3- ю букву, например : mod(n, 3) == 2 , затем объединитесь в строку и list() .

       >>> list(''.join(l + 'x' * (n % 3 == 2) for n, l in enumerate(letters))) ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 
    2. Используйте вложенные средства для выравнивания списка списков (a) , нарезанных группами по 3 с добавлением 'x' если меньше 3 из конца списка.

       >>> [x for y in (letters[i:i+3] + ['x'] * (i < len(letters) - 2) for i in xrange(0, len(letters), 3)) for x in y] ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

    (a) [item for subgroup in groups for item in subgroup] выравнивает список из перечеркнутого списка.

    Попробуй это

     i = n while i < len(letters): letters.insert(i, 'x') i += (n+1) 

    где n – после того, сколько элементов вы хотите вставить 'x' .

    Это работает, инициализируя переменную i и устанавливая ее равной n . Затем вы настраиваете цикл while, который выполняется, в то время как i меньше длины letters . Затем вы вставляете 'x' в индекс i letters . Затем вы должны добавить значение n+1 в i . Причина, по которой вы должны сделать n+1 вместо просто n состоит в том, что когда вы вставляете элемент в letters , он расширяет длину списка на единицу.

    Попробуйте это с вашим примером, где n равно 3, и вы хотите вставить 'x' , это будет выглядеть так

     letters = ['a','b','c','d','e','f','g','h','i','j'] i = 3 while i < len(letters): letters.insert(i, 'x') i += 4 print letters 

    который будет распечатываться

     ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

    который является вашим ожидаемым результатом.

    Хотя использование list.insert() в цикле for кажется более эффективным с точки зрения памяти, для того, чтобы сделать это в одной строке, вы также можете добавить данное значение в конце каждого одинаково разделенного фрагмента, разбитого на каждый nth индекс список.

     >>> from itertools import chain >>> n = 2 >>> ele = 'x' >>> lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(chain(*[lst[i:i+n] + [ele] if len(lst[i:i+n]) == n else lst[i:i+n] for i in xrange(0, len(lst), n)])) [0, 1, 'x', 2, 3, 'x', 4, 5, 'x', 6, 7, 'x', 8, 9, 'x', 10] 

    Довольно простой метод:

     >>> letters = ['a','b','c','d','e','f','g','h','i','j'] >>> new_list = [] >>> n = 3 >>> for start_index in range(0, len(letters), n): ... new_list.extend(letters[start_index:start_index+n]) ... new_list.append('x') ... >>> new_list.pop() 'x' >>> new_list ['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j'] 

    Вы также можете использовать рецепт grouper из документации itertools для фрагментации.

    Я хочу добавить новый элемент для каждого элемента.

    Как насчет этого ?

     a=[2,4,6] for b in range (0,len(a)): a.insert(b*2,1) 

    а сейчас

     [1, 2, 1, 4, 1, 6] 
     l = ['a','b','c','d','e','f','g','h','i','j'] [ l.insert(n+(n+1)*i, 'x') for i in range(len(l)/n) ] print l 
    Python - лучший язык программирования в мире.