質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

867閲覧

辞書型の順番がおかしくなる件

humuhimi

総合スコア49

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/05/17 17:09

編集2019/05/17 17:12

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
現在自然言語処理の100本ノックの5本めをしているのですが、
なぜか辞書型をアップデートしている途中で順番がおかしくなってしまいます。
客観的にどうすればいいか教えてください。
よろしくお願いします。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題

In [19]: elem
Out[19]:
{'0': 'H',
'1': 'He',
'10': 'Na',
'11': 'Mi',
'12': 'Al',
'13': 'Si',
'14': 'P',
'15': 'S',
'16': 'Cl',
'17': 'Ar',
'18': 'K',
'19': 'Ca',
'2': 'Li',
'3': 'Be',
'4': 'B',
'5': 'C',
'6': 'N',
'7': 'O',
'8': 'F',
'9': 'Ne'}

上記の問題を普通に0,1,2,3,....という順番で出力する想定です。

該当のソースコード

python

1""" 204. 元素記号 3"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ. 4""" 5# 空白を元に分割して配列の中に入れる。 6# 1, 5, 6, 7, 8, 9, 15, 16, 19番目は先頭1文字, それ以外は先頭2文字を取り出しリストに入れなおす。 7# 同様に何番目かを保持しておく。 8# 単語の位置を保持する(先頭から何番目か) 9# 辞書型{何番め:単語}で連想配列を作成。 10 11text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." 12text = text.split(" ") 13solo_num = [] 14solo_num = [1, 5, 6, 7, 8, 9, 15, 16, 19] # これら全てから1を引く 15solo_num[:] = [n - 1 for n in solo_num] 16elem = {} 17 18 19for i in range(len(text)): 20 if i in solo_num: 21 elem.update({str(i):text[i][0]}) 22 else: 23 elem.update({str(i):text[i][0] + text[i][1]}) 24 25 26

どなたかご教授よろしくお願いします。

また、pythonのスライスがよくわかってないので
solo_num[:]というのはどのような処理をしているかも知っていれば教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

なぜか辞書型をアップデートしている途中で順番がおかしくなってしまいます。

Python2.x環境で実行されているためです。もともと辞書型の要素の順序は不定です。
もっともPython3.6(のCPython)から辞書型でも順序を保持するようになりましたが。
Python2.x環境でも順序を保持するにはOrderedDictを使ってください。
Pythonの順序付き辞書OrderedDictの使い方

Python

1from collections import OrderedDict 2# 略 3#elem = {} 4elem = OrderedDict()

投稿2019/05/17 22:18

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

humuhimi

2019/05/18 05:44

なるほどそういうことなんですね。普段使わない環境で実行していたので、きずきませんでした。ありがとうございます!
guest

0

自己解決

上記のコードをターミナル上のpythonで実行した結果
予期した動作になりました。
おそらく、エディター上に問題があると思われました。

また、solo_num[:]についてですが

solo_num = [1, 5, 6, 7, 8, 9, 15, 16, 19]
solo_num = [n - 1 for n in solo_num]
の場合、ディープコピーになり二つのオブジェクトがある状態で別々のデータを参照している状態です。
solo_num = [1, 5, 6, 7, 8, 9, 15, 16, 19]
solo_num[:] = [n - 1 for n in solo_num]
は、シャローコピーで同じオブジェクトを参照している状態です。

投稿2019/05/17 17:52

humuhimi

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問