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

时间:2015-06-25 03:05:20

标签: python list indexing insert slice

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

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

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

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

我知道我可以通过循环和插入来做到这一点。我真正想要的是一种Python方式,也许是一个单行程?

9 个答案:

答案 0 :(得分:13)

我有两个衬垫。

假设:

>>> letters = ['a','b','c','d','e','f','g','h','i','j']
  1. 使用enumerate获取索引,每3 rd 字母添加'x'例如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 points out如果任何元素都有多个字母,则无效。

  2. 使用嵌套的理解来展平列表(a)的列表,如果列表末尾少于3,则以3个为一组切换'x'

    >>> [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']
    
  3. (a)[item for subgroup in groups for item in subgroup]压扁了一堆锯齿状的列表。

答案 1 :(得分:7)

试试这个

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插入元素时,它会将列表的长度扩展一个。

尝试使用'x'为3并且您想要插入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']

会打印出来

InMemoryUserDetailsManagerConfigurer

这是您的预期结果。

答案 2 :(得分:4)

虽然在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]

答案 3 :(得分:2)

for 循环已经可以选择以某个值递增/递减:

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

for i in range ( n, len(letters)+n, n+1 ):
  letters.insert ( i, 'X' )

print ( letters )

它不需要除法或模运算,只需加法和一种尺寸计算。输出:

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

答案 4 :(得分:1)

一种非常简单的方法:

for(int i=0; i < names.Length; i++) names[i] = names[i].Replace("!", string.Empty);

您还可以使用itertools文档中的>>> 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'] 配方进行分块。

答案 5 :(得分:1)

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

这个怎么样?

{{myForm?.inputControlX?.valid}}
//OR    
<span *ngIf="myForm"> {{myForm.inputControlX.valid}}</span>

a现在是

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

答案 6 :(得分:1)

这是一个古老的话题,但是它缺少最简单,最“ pythonic”的解决方案imo。仅仅是对Mark Mikofski accepted answer的第2部分的扩展,可以提高可读性(因此使其更具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']

答案 7 :(得分:1)

也有必要说明简单的实现方式:

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

i = 3   #initial step
while i < len(letters):
    letters.insert(i,'x')
    i = i + 3 + 1  #increment step by one for every loop to account for the added element

它确实使用了基本的循环和插入功能,但是比起单行代码的示例,它看起来也更简单易读,恕我直言,IMHO首先使它更加Pythonish

答案 8 :(得分:-2)

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