2013-07-21 121 views
1

我是Python中最新的。集合中的迭代,不理解這種迭代的方式

我不明白爲什麼在代碼結果{9,4}第一個數字是9但不是4?從第一組迭代開始迭代 ?

{x*y for x in {1,2,3} for y in {2,3,4} if x == y} 
{9, 4} 
+4

雖然set是可迭代的,但它們有一個類似於'dicts'的任意順序 - 因爲兩者都基於散列值...如果你需要一個有序集合,那麼在Python文檔中有一個配方鏈接:http:// code.activestate.com/recipes/576694/ –

回答

3

集合是無序的。集合中元素的順序由散列函數定義,而不是插入的順序。

+1

不僅通過哈希函數,還取決於底層表的大小,容器上過去的插入和刪除順序,實現細節(例如探針序列)和某些版本(有時只有在給定某個命令行標誌的情況下)哈希隨機化可以在相同程序的相同調用之間變化。 – delnan

+0

在這種特殊情況下,沒有刪除。但是,是的,「通過實施細節」定義將是一個更準確(如果不是說明)的說明。事實上,並沒有要求將集合實現爲哈希表。 –

+0

我確實認爲它是散列表,或者至少它們使用'__hash__'和'__eq__',而不是其他任何操作(例如比較)。否則,集合中使用的一半類型(以及關於這個問題的字典)將在另一個實現中停止使用集合。 – delnan

4

結果是一組排序無關緊要。如果你使用列表運行相同的事情(用{]替換{}),那麼你會得到[4,9]。