Вставить элемент в список 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 сторону, один вкладыш может быть?

7 ответов


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

дано:

>>> letters = ['a','b','c','d','e','f','g','h','i','j']
  1. использовать enumerate чтобы получить индекс, добавьте 3 rd письмо например: 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']
    

    , а как @sancho.s указывает это не работает, если любой из элементов имеет более одной буквы.

  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 to i. Причина, по которой вы должны сделать просто 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 loop кажется более эффективной памятью, чтобы сделать это в одной строке, вы также можете добавить заданное значение в конце каждого равномерно разделенного куска, разделенного на каждом 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 для фрагментации.


Это старая тема, но ей не хватает простой, наиболее "подходящие для Python" решение, ИМО. Это не более чем расширение до части 2 Марк Mikofski ' s принято отвечать что, возможно, улучшает читаемость (а значит делает его более подходящие для Python).

>>> letters = ['a','b','c','d','e','f','g','h','i','j']
>>> [el for y in [[el, 'x'] if idx % 3 == 2 else el for 
     idx, el in enumerate(letters)] for el in y]

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

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

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

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

a теперь

[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