说我有一个像这样的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方式,也许是一个单行程?
答案 0 :(得分:13)
我有两个衬垫。
假设:
>>> letters = ['a','b','c','d','e','f','g','h','i','j']
使用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如果任何元素都有多个字母,则无效。
使用嵌套的理解来展平列表(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']
(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