2016-05-19 12 views
-1

次のコードは、複数回実行すると一貫性のない結果を生成します。私はPython-3.5.1でDebian 8.4(jessie)上で実行しました。複数の実行後heapq.nlargestは一貫性のない結果を生成します

from heapq import nlargest 
from operator import itemgetter 

dd = dict([('41', 768.0), ('2', 15275.0), ('9', 1728.0), ('90', 1728.0), 
      ('97', 1200.0), ('68', 2904.0), ('98', 4380.0), ('16', 768.0), 
      ('37', 768.0), ('17', 1587.0), ('25', 4495.4)]) 

print(nlargest(5, dd.items(), key=itemgetter(1))) 

出力:

[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('90', 1728.0)] 
[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('9', 1728.0)] 
[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('90', 1728.0)] 
[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('90', 1728.0)] 

それがランダムに見えるなぜこれが起こっている、誰も説明できますか?

dd.items()sorted(dd.items())に置き換えた場合、出力は確定的になります。すなわち

[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('9', 1728.0)] 

私はまたのpython-2.7とOSXとCentOS6.7上のコードの上に試みたが、それは常に

[('2', 15275.0), ('25', 4495.4), ('98', 4380.0), ('68', 2904.0), ('9', 1728.0)] 

を返し、これはのpython3 heapq実装にバグがあることができますか?

+0

OSとPythonのバージョンはどちらを使用していますか?出力はWin10とPython 2.7と3.4 64bitで一定です。 –

+0

Python-3.5.1のDebian 8.4(jessie)です。 – zyxue

+0

興味深いことに、Pythonのバグかもしれません。私はちょうどOS XでPython 2.7を試したところ、出力は一貫しています。私はそれがヒープの問題かもしれないと思った。 – zyxue

答えて

1

あなたは5番目の項目を求めており、5位には同点があります。 Pythonがどのように結びついているかは任意であり、非決定的な振る舞いはバグではありません。

dictの反復順序は任意で、Python 3.3以降では、文字列やその他の型のハッシュランダム化がデフォルトで有効になっているためです。したがって、heapq.nlargestがdict項目を受け取る順番にはランダムな要素があり、それが結び目を破る方法は項目を表示する順序によって異なります。

+0

重要なアイデアは' Python 3.3以降、文字列や特定の他の型のハッシュランダム化がデフォルトで有効になっているので、このランダム性はPython 2.7では起こりません – zyxue

関連する問題