2017-05-29 10 views
0

で列挙して行動し、python3.5.2奇妙な私はpython2.7.12に走った次のコードスニペットを持っているのpython3

f = open(file_name,'r') 
file_data= f.read() 
f.close() 
char_list = list(set(file_data)) 
c = {char:i for i,char in enumerate(char_list)} 
x = {i:char for i,char in enumerate(char_list)} 

python2.7.12に走ったとき、私は期待した結果を得る:

{'a': 0, ' ': 1, 'e': 2, 'i': 3, 'h': 4, '\n': 5, 'o': 6, 'r': 7, 'u': 8, 'w': 9, 'y': 10, '?': 11} 
{0: 'a', 1: ' ', 2: 'e', 3: 'i', 4: 'h', 5: '\n', 6: 'o', 7: 'r', 8: 'u', 9: 'w', 10: 'y', 11: '?'} 

python3.5.2では、何か奇妙なことが起こります。私は時々のような結果を得る:python2.7.12 python3.5.2に、また

{'h': 1, 'e': 4, 'r': 2, 'i': 3, '?': 0, '\n': 5, ' ': 6, 'u': 7, 'a': 8, 'y': 9, 'o': 10, 'w': 11} 
{0: '?', 1: 'h', 2: 'r', 3: 'i', 4: 'e', 5: '\n', 6: ' ', 7: 'u', 8: 'a', 9: 'y', 10: 'o', 11: 'w'} 

をではなく、プログラムがchar_list実行されるたびに異なるためです。これはpython2.7.12のたびに同じ順序で実行されます。

両方のバージョンのPythonでは、enumerateは反復可能なオブジェクトを返します。

なぜこの奇妙な現象が起こっていますか?

P.S. char_listのコピーを作成し、2番目の列挙型にコピーすると発生しますchar_list

+1

Python dictsは注文されません。読みやすい出力をしたい場合は、項目を並べ替えます。 Python 3は特定の攻撃を緩和するためにdictの順序をランダム化し、 '-R'フラグを渡すか、環境で' PYTHONHASHSEED = random'を設定することでPython 2で同じことを有効にすることができます。 – Ryan

+0

@Ryanよく、_technically_ Python 3.6用のCPythonインタプリタは辞書を注文しています。これは実装の詳細ですが、それに頼るべきではありません。 –

+0

これは 'list(set)'の返り値にも当てはまりますか?それも無作為化されているようだ。 – dylan7

答えて

0

列挙型は正常に動作しますが、データを辞書に保存すると、Pythonはその順序を維持しません。デフォルトでは、Python辞書は順序付けされておらず、追加されたのと同じ順序でキーと値のペアを保つことは保証されていません。 OrderedDictは、約hereを読むことができるPythonの良い解決策です。また、CPython 3.6の辞書では順序が維持されますが、これは将来保証されません。

注文を保存したい場合は、リストまたはタプルの使用を検討してください。

0

私はあなたの問題を両方複製することができ、以下の変更を加えることで、期待される出力を得ることができました。

2つの変更があります。まず、char_list = list(set(file_data))と書くと、データはセットとして格納されます。これは、unordered data typeです。つまり、必ず格納されている順序は保持されません。したがって、単にsetテキストを削除すると、注文問題が解決されます。

結果に表示される新しい行のテキストについては、file_data= f.read()行に.strip('\n')を追加するだけで、自動的にそのテキストが削除されます。変更を行うと、彼らが働く確認した後、あなたのコードは次のようになります

f = open(file_name,'r') 
file_data= f.read().strip('\n') 
f.close() 
char_list = list(file_data) 
c = {char:i for i,char in enumerate(char_list)} 
x = {i:char for i,char in enumerate(char_list)} 

は、この情報がお役に立てば幸い!

関連する問題