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)
使用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 指出的那样,如果任何元素都有多个字母,这就不起作用.
使用嵌套的理解来展平列表列表(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]
压扁锯齿状的清单.
试试这个
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+1
to 的值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
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)
这是你的预期结果.
我想为每个项目添加一个新元素。
这个怎么样 ?
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)
尽管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)
归档时间: |
|
查看次数: |
17075 次 |
最近记录: |