2009-08-06 51 views
8

對於Python和numpy的數組和列表被以下行等效:'對於數組中的x'總是導致排序的x? [Python的/ NumPy的]

itemlist = [] 
for j in range(len(myarray)): 
    item = myarray[j] 
    itemlist.append(item) 

和:

itemlist = [] 
for item in myarray: 
    itemlist.append(item) 

我感興趣的順序ITEMLIST的。在我已經嘗試過的幾個例子中,它們是相同的,但是保證?例如,我知道C#中的foreach語句不保證順序,我應該小心它。

+0

您的意思是:對於範圍內的j(len(myarray)):? – clawrence 2009-08-06 21:47:58

+0

哎呀,是的,我的意思是扔在一個範圍內() – Chris 2009-08-07 15:50:48

回答

10

它保證列表。我認爲與您的C#示例並行的更相關的Python會遍歷字典中的鍵,但不能保證以任何順序。

# Always prints 0-9 in order 
a_list = [0,1,2,3,4,5,6,7,8,9] 
for x in a_list: 
    print x 

# May or may not print 0-9 in order. Implementation dependent. 
a_dict = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9} 
for x in a_dict: 
    print x 

for <element> in <iterable>結構只是擔心,iterable供應next()函數返回的東西。沒有一般保證這些元素以任何順序在for..in聲明的域中返回;列表是一種特殊情況。

+1

感謝您高亮顯示數組有一個順序的概念,它是通過next()函數實現的。 for ... in ...結構利用next(),所以具有內部順序(數組)的數據實現next()不同於沒有內在順序的數據(例如字典)。 – Chris 2009-08-07 15:56:37

10

是的,它完全有保證。 for item in myarray(其中myarray序列,其包括numpy的的陣列,內置列表,Python的array.arrays,等等等等),是實際上相當於在Python:

_aux = 0 
while _aux < len(myarray): 
    item = myarray[_aux] 
    ...etc... 

一些幻象可變_aux ;-) 。順便說一句,無論你的結構也都等同於

itemlist = list(myarray) 
+0

謝謝!是的,我沒有真的想將數組轉換爲列表,只是探索順序。 – Chris 2009-08-07 15:51:48

6

是的,Python Language Reference保證本(重點是我的):

for_stmt ::= "for" target_list "in" expression_list ":" suite 
       ["else" ":" suite] 

「該套件則提供每個項目執行一次 迭代器,按升序索引的順序排列。「

相關問題