在每个第n个元素之后在Python列表中插入元素

Has*_*bal 23 python indexing list insert slice

假设我有一个像这样的Python列表:

letters = ['a','b','c','d','e','f','g','h','i','j']
Run Code Online (Sandbox Code Playgroud)

我想在每个第n个元素后插入一个'x',假设该列表中有三个字符.结果应该是:

letters = ['a','b','c','x','d','e','f','x','g','h','i','x','j']
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过循环和插入来做到这一点.我实际上寻找的是一种Python方式,也许是一个单行程?

Mar*_*ski 13

我有两个一个衬里.

鉴于:

>>> letters = ['a','b','c','d','e','f','g','h','i','j']
Run Code Online (Sandbox Code Playgroud)
  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']
    
    Run Code Online (Sandbox Code Playgroud)

    但正如@ 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']
    
    Run Code Online (Sandbox Code Playgroud)

(a)[item for subgroup in groups for item in subgroup]压扁锯齿状的清单.

  • 如果元素不是单个字符,则第一个不起作用.它最终得到一个列表,每个元素都是一个字符(拆分字符串). (3认同)

mic*_*pri 8

试试这个

i = n
while i < len(letters):
    letters.insert(i, 'x')
    i += (n+1)
Run Code Online (Sandbox Code Playgroud)

n您要插入多少元素之后的位置'x'.

这通过初始化变量i并将其设置为等于n.然后设置一个while循环,运行时i的长度小于letters.然后'x'在索引i中插入letters.然后你必须添加n+1to 的值i.你必须做的n+1而不仅仅是n因为当你插入一个元素时letters,它会将列表的长度扩展一个.

尝试使用您的示例n3,并且您想要插入'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
Run Code Online (Sandbox Code Playgroud)

哪个会打印出来

['a', 'b', 'c', 'x', 'd', 'e', 'f', 'x', 'g', 'h', 'i', 'x', 'j']
Run Code Online (Sandbox Code Playgroud)

这是你的预期结果.

  • @michaelpri `insert()` 本身需要 `O(n)`,在 `while` 循环中使用使其成为二次函数。这是显示每个操作的时间复杂度的 [wiki](https://wiki.python.org/moin/TimeComplexity)。 (2认同)

Tim*_*eed 6

我想为每个项目添加一个新元素。

这个怎么样 ?

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

现在是

[1, 2, 1, 4, 1, 6]
Run Code Online (Sandbox Code Playgroud)


ozg*_*gur 5

尽管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]
Run Code Online (Sandbox Code Playgroud)

  • +1 for [`itertools.chain`](https://docs.python.org/2/library/itertools.html#itertools.chain) 方法,使`[item for subgroup in group for item in subgroup ]` 这总是很难记住。在列表理解中使用 [ternary](https://docs.python.org/2/reference/expressions.html#conditional-expressions) 也+1;出于某种原因我没有想到这一点,太棒了! (2认同)