2013-04-09 185 views
1

我想将列表中的每个第N个元素设置为其他值。指定python列表中的每个第N个元素

(像this question这是Matlab的。)

这里有N = 2的尝试:

>>> x=['#%d' % i for i in range(10)] 
>>> x 
['#0', '#1', '#2', '#3', '#4', '#5', '#6', '#7', '#8', '#9'] 
>>> x[0::2] = 'Hey!' 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 4 to extended slice of size 5 

我怎样才能解决这个问题?切片似乎期望可迭代,而不仅仅是一个单一的值。

+0

这不是一个数组,它是一个列表。这很重要,因为在标准库中有一个数组类型,并且在普通库'numpy'中有一个不同的类型,并且具有一个numpy'array','x [:: 2] ='Hey!''会实际上已经工作.. – DSM 2013-04-09 18:46:22

+0

谢谢,我已经纠正它。 – 2013-04-09 20:14:12

回答

1

也可以用列表理解:

x=['#%d' % i for i in range(10)] 
['Hey!' if i%3 == 0 else b for i,b in enumerate(x)] 

这显然是n = 3。

2

切片分配的右侧必须是适当长度的序列; Python将'Hey!'视为一个字符序列'H', 'e', 'y', '!'

你可以巧妙并创建相应长度的序列:

x[::2] = ['Hey!'] * len(x[::2]) 

然而,要做到这一点最清楚的方式是for循环:

for i in range(0, len(x), 2): 
    x[i] = 'Hey!' 
+0

好的。这很直截了当,但它似乎...... unpythonic .... – 2013-04-09 18:32:42

+0

@JasonS有一个单线(上面加上),但它的可读性显着降低。 – ecatmur 2013-04-09 18:34:28

+0

我认为第一个解决方案是个人化的Pythonic。 – cwallenpoole 2013-04-09 18:40:17

相关问题