2016-09-28 61 views
-1

假設我有兩個數組:如何保持特定元素指數法在一個數組

a = [1, 4, 9, 16, 25, 36, 49, 64, 81] 
b = [2,5,7] 

我要保持在一個索引的元素被列在B上的第2,第5和第7個指標:

a_new = [4, 25, 49] 

然後,我將繪製b對a_new /執行分析。

對於我的應用程序,a是一個很長的一系列模擬數據,b是我想從這些數據中採樣的時間序列。

感謝

+3

'a_new = [a [i-1] for i in b]' – ewcz

+0

a_new = [a [i - 1] for i in b] – Querenker

+0

你能解釋一下它是如何工作的嗎?我得到'列表索引超出範圍'的錯誤。謝謝 –

回答

2

首先記住的陣列的第一個元素(或在這種情況下,列表)是數字0和不numbe ,R 1:

a = [1, 4, 9, 16, 25, 36, 49, 64, 81] 
a[0] = 1 # How to adress the first element 
a[1] = 4 # How to adress the second element 
a[2] = 9 # ... 

所以,你要(在數組b中指定)的元素是:

a[1] = 4 # a[1] is the same as a[2 - 1] (note that b[0] = 2) 
a[4] = 25 # a[4] is the same as a[5 - 1] (note that b[1] = 5) 
a[6] = 49 # a[6] is the same as a[7 - 1] (note that b[2] = 7) 

所以,你也可以訪問的內容是這樣的:

a[ b[0] - 1 ] = 4 # Same as a[1] which is the second element 
a[ b[1] - 1 ] = 25 # Same as a[4] which is the fifth element 
a[ b[2] - 1 ] = 49 # Same as a[6] which is the seventh element 

這可以封裝在for循環中:

a_new = [] # Start with an empty list 
for index in b: # index in b are all elements in b, thus: b[0] = 2, b[1] = 5 and b[2] = 7 
    a_new.append(a[ index - 1]) 

此循環將放元件a[2 - 1](4),a[5 - 1](25)和a[7 - 1](49)到列表a_new

但有編寫循環較短方式:

a_new = [ a[ index - 1] for index in b ] 

基本上,你說a_new = [ ... ],所以a_new是一個列表,而...內將指定,什麼名單將充滿。在這種情況下,這將是元素for循環產生,請注意,a[ index - 1] for index in b是如在第一個例子中相同的for循環,寫在一個緊湊的方式。

如果你得到一個列表索引超出範圍的錯誤?
您的列表a包含9個元素,所以第一個元素是a[0],最後一個是a[8]。如果您嘗試訪問列表中的任何其他元素(例如a[12]),則會出現「列表索引超出範圍」錯誤。
這意味着:在B名單應該只包括1和9(列表,你可以找出這樣len[a] = 9的長度)之間的數字。

我會建議,你b變動的名單b = [1, 4, 6],因爲數組的第五元素實際上是不客氣像a[4]而不是a[5]
的代碼會更容易一點:

a_new = [ a[index] for index in b ] 

如果您不希望錯誤的情況發生,在B值應然後就0-8(這是len(a) - 1)之間,因爲a[0]是第一和a[8]是最後一個元素,並且只存在這個元素!

+0

感謝您的詳細解答,對初學者非常有幫助! –

1

還有,你可能會遇到這兩個國家都在評論中已經有所提到的兩個可能的問題。從我看到的情況來看,您在閱讀時遇到問題,或者您的索引無效。

對於前者,你實際上可能需要

a = [1, 4, 9, 16, 25, 36, 49, 64, 81] 
b = [2,5,7] 

生產出:因此

[1, 4, 9, 16, 25, 36, 49, 64, 81] 
0 1 2 3 4 5 6 7 8 

,導致XY problem

a_new = [9, 36, 64] 

因爲你總是計數從零開始,你嘗試用你的方式這是錯誤的方法。因此,它浪費我們的時間來嘗試修復一個無效的問題,因爲它實際上是另一回事。

但是,對於後者,您可能在b列表中出現異常。以指數的方式列表(在評論中給出),你想使用list comprehension

a_new = [a[i-1] for i in b] 

這樣做是:

a_new = [] 
for i in b: 
    a_new.append(a[i-1]) 

因此,當i大於或等於len(a),它的計算結果爲無效的索引:

>>> a = [1, 4, 9, 16, 25, 36, 49, 64, 81] 
>>> len(a) 
9 
>>> a[9] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list index out of range 
+0

感謝您的詳細解答,對初學者非常有幫助:) –