2016-08-04 51 views
0

如果我在python Data中有一個2D列表,並且我想創建一個2D列表的一部分,我從第一個索引中選擇所有元素,從第二個索引中選擇一個。爲什麼pythons切片索引提供反直覺結果?

例如。

Data = [[a,b,c],[d,e,f],[h,i,g]] 

我想要清單;

raw_data = [b,e,i] 

爲什麼要做類似的事情;

​​

沒有給出所需的輸出? 我已經爲第二個指定了整個第一個索引和第一個索引。相反,我得到的輸出是;

raw_data = [d,e,f] 

這是我期望得到的;

raw_data = Data[1][:] 

raw_data = [d,e,f] 

所以;

Data[1][:] = Data[:][1] 

這與我的心智模式如何在python中的工作方式不兼容。我不得不使用循環來做到這一點;

raw_data = [] 

for i in xrange(0,len(Data),1): 
     raw_data.append(Data[i][1]) 

所以我的問題是,任何人都可以解釋爲什麼Data[1][:] = Data[:][1]

感謝您的閱讀!

+0

採取的指數1元完整的列表將生成一個副本,所以你正在製作一個完全相同的副本,然後從中獲取項目'1',或獲取項目'1',然後複製結果。 –

+0

我假設你來自一個具有多維列表的編程語言,如果你這樣做,可以嘗試'numpy',因爲它可以讓你做'Data [:, 1]'來獲得你想要的結果。 –

+0

'list [:]'只是list的一個副本。這意味着'data [:] == data'(ish)和'data [1] == data [1] [:]'。所以當然''data [1] [:] == data [:] [1]' –

回答

2

lst[:]沒有明確的開始沒有明確的結束,所以根據Python文檔,它將返回列表的一個副本,從列表的開始和結束開始。換句話說,它會返回您之前擁有的相同列表的副本。所以:

>>> Data = [['a','b','c'],['d','e','f'],['h','i','g']] 
>>> Data[:] 
[['a', 'b', 'c'], ['d', 'e', 'f'], ['h', 'i', 'g']] 

所以,當你說Data[:],將評估對相同的Data副本,這意味着Data[:][1]本質上只是Data[1],這是[d,e,f]

如果你做它的其他方式:

>>> Data[1] 
['d', 'e', 'f'] 
>>> Data[1][:] 
['d', 'e', 'f'] 

你得到的數據,[d,e,f]第二個元素,那麼你用的是相同的列表切片語法之前再次得到相同的列表。

爲了得到你想要的東西,我會使用列表理解:

>>> [x[1] for x in Data] 
['b', 'e', 'i'] 

這麼簡單。

+0

你從字面上打我20秒:D –

+0

你沒有提到'l [:]'_創建list_的副本,不返回相同的列表!儘管這種情況並不重要,但它很容易傳播關於切片的誤解。 –

+0

你是對的,我應該已經更加明確 - 現在可能無所謂,但我編輯它更清晰 – James

0

這很明顯,如果你經歷從左到右發生的事情。

raw_data = Data[:] 

會給你全部數據,因此列表的整個列表:然後[[a,b,c],[d,e,f],[h,i,g]]

​​

會給你的元素索引1在這份名單中,這是[d,e,f]

另一方面, raw_data = Data [1] 將返回數據中位置1的元素,也是[d,e,f]

[:]此對象將再次返回其本身。

你所試圖做的是最好用列表解析完成,如:

raw_data = [x[1] for x in Data] 

這將使你在所有的數據列出了所有第二個元素的列表。

1

Vanilla Python沒有二維數組,但它確實允許擴展來實現它們。你有一份清單,有些不同。

您的問題的解決方案是使用numpy它具有2d數組類型。那麼你可以說data[:,1]

爲什麼你希望你的例子不工作:data[:]手段「的data副本」等data[:][1]意味着data的副本,這是[d,e,f]

+0

二維numpy數組實際上只是一個數組的數組,根本沒有太大的差別。對於他的用例numpy真的不會添加任何東西。 – James

+0

@James列表和numpy數組的實現方式大不相同,訪問數組的列顯然比多維列表更容易'Data [:,1]'。 –

+0

@詹姆斯我傾向於不同意,一個numpy數組是一個多維結構。從概念上講,它與列表清單不同。如果你實際上有一個2d數組,並且它包含一致類型的數據,那麼'data [:,1]'更短,更容易閱讀並且比理解更快。如果你實際上有一個列表清單(例如可變長度行,不一致類型),那麼理解更自然。 –

相關問題