2013-04-09 181 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

相關問題