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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1568閲覧

Python3のlist内の日本語の扱い

kinesin_lks

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2017/11/26 10:28

編集2017/11/26 13:09

Python3で日本語のlistを扱う時の質問です。

list = ['スシ食べたい']
の'ス'を取得しようとすると、
list[0]で取得できる時もあれば、list[:3]で取得できる時もあります。
この違いがよくわかりません。
どなたかわかる方いますか?

開発環境は、
Mac/Terminalでemacs使ってます。

Python

1list = ['スシ', 'ビーフシチュー', 'ラーメン'] 2 3# 'スシ'の'ス'を出力したい 4 5#これで出力できる時もあれば 6print(list[0][0]) 7 8#これで出力できる時もある 9print(list[0][:3])

/-------------------追記----------------------/
実際のコードは競プロのものなので、似たものを追加いたします。
コードの目的はリストのなかでしりとりをさせるものです。

Python

1import copy 2 3list = ["スライド", "ドングリ", "ドミノ", "ドンブリ", "ヌードル"] 4 5def search(data, i, order): 6 data[i][3] = 1 7 for j in range(len(data)): 8 if j == len(data) - 1: print('fin') 9 elif data[i][2] == data[j][1]: 10 # search 11 # もし最後の文字と最初の文字が同じものがあれば再帰させる 12 order.append(len(order)) 13 search(data, j, order) 14 return order 15 16def main(): 17 # 最初の一文字を格納するためのリスト 18 s_list = [] 19 # 最後の一文字を格納するためのリスト 20 e_list = [] 21 # しりとりの順番を格納するためのリスト 22 order = [] 23 # 単語、一文字目、最後の文字をまとめて格納するためのリスト 24 m_list = [] 25 # m_listを全単語分まとめて格納するためのリスト 26 data = [] 27 28 for i in list: 29 s_list.append(i[0:3]) 30 e_list.append(i[len(i) - 3:]) 31 for i in range(len(list)): 32 m_list.append(list[i]) 33 m_list.append(s_list[i]) 34 m_list.append(e_list[i]) 35 m_list.append(0) 36 data.append(copy.deepcopy(m_list)) 37 del m_list[:] 38 39 for i in range(len(data)): 40 m_data = search(copy.deepcopy(data), copy.deepcopy(i), copy.deepcopy(order)) 41 # search関数より得られた順番を出力 42 print(str(m_data).decode('string-escape') 43 44if __name__ == '__main__': 45 main() 46

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

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

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

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

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

miyahan

2017/11/26 10:59

サンプルコードにおいて print(list[0][:3]) は「スシ」となるはずですが、「ス」と出るということですか?
kinesin_lks

2017/11/26 12:10

はい。「ス」と表示される時もあれば、「スシ」と表示される時もあります。最初はprint(list[0][0])で「ス」が表示できていたのですが、途中からエラーが出るようになってしまいました。いろいろ試したところ、print(list[0][:3])で「ス」と表示されてしまうのでおかしいと思い、質問いたしました。
miyahan

2017/11/26 12:31

「途中からエラーが出る」というのは具体的にどういったエラーメッセージですか?
kinesin_lks

2017/11/26 12:37

論理エラーの類かと思います。元々は正常に「ス」と表示されていたのですが、途中から「?」と表示されるようになってしまいました。「?」が半角だったので、もしかしたら半角で認識されているのでは?と考えました。いろいろと弄った結果、print(list[0][:3])でうまくいきました。
miyahan

2017/11/26 12:41

実際に問題を再現出来るコードと、実際に出力されたエラーメッセージを可能な範囲で質問本文に追記いただけますか。
kinesin_lks

2017/11/26 13:11

ご指摘ありがとうございます。追記いたしました。
guest

回答2

0

ベストアンサー

しりとりですか。最長解を出すのだとしたら数学的なアプローチが要るかなり重いジャンルですね…。

それはさておき提示されたコードは文法エラーと再帰エラーで動かないので、かいつまんで拝見しましたが最初にキーワードを加工して各リストに格納する段階で意図したとおり行っていないように見えます。

python

1def main(): 2 3 """中略""" 4 5 print(f's_list: {s_list}') 6 print(f'e_iist: {e_list}') 7 print(f'order: {order}') 8 print(f'm_list: {m_list}') 9 print(f'data: {data}')

text

1s_list: ['スライ', 'ドング', 'ドミノ', 'ドンブ', 'ヌード'] 2e_iist: ['ライド', 'ングリ', 'ドミノ', 'ンブリ', 'ードル'] 3order: [] 4m_list: [] 5data: [['スライド', 'スライ', 'ライド', 0], ['ドングリ', 'ドング', 'ングリ', 0], ['ドミノ', 'ドミノ', 'ドミノ', 0], ['ドンブリ', 'ドンブ', 'ンブリ', 0], ['ヌードル', 'ヌード', 'ードル', 0]]

1文字目なら foo_str[0]、最後の1文字なら foo_str[-1] のスライスで取り出せます

python

1 for word in list: 2 s_list.append(word[0]) 3 e_list.append(word[-1]) 4 m_list.append([ 5 word, 6 word[0], 7 word[-1], 8 0, 9 ]) 10 11 print(f's_list: {s_list}') 12 print(f'e_iist: {e_list}') 13 print(f'order: {order}') 14 print(f'm_list: {m_list}') 15 print(f'data: {data}')

text

1s_list: ['ス', 'ド', 'ド', 'ド', 'ヌ'] 2e_iist: ['ド', 'リ', 'ノ', 'リ', 'ル'] 3order: [] 4m_list: [['スライド', 'ス', 'ド', 0], ['ドングリ', 'ド', 'リ', 0], ['ドミノ', 'ド', 'ノ', 0], ['ドンブリ', 'ド', 'リ', 0], ['ヌードル', 'ヌ', 'ル', 0]] 5data: []

なにかうまくいかなかったら、デバッガーを使ったり、上記のように変数を出力(printデバッグといいます)して意図したとおりになっているかチェックしてみて下さい。

ここのバグを潰せばやりたいことの実現に近づけると思います。


余談:

まず wakame さんが仰るとおり list は予約語ですので変数名を変えたほうがよいと思います。

また Python のインデントは PEP 8 という規約で半角スペース4文字と定められているのでそれにあわせた方がよいでしょう。

さらに m_list に格納された各要素は順番を持たない独立した情報なのでリストよりも辞書を使った方が自然ですし、バグを生みにくくなると思います。

python

1 for word in list: 2 m_list.append({ 3 'word': word, 4 'first_str': word[0], 5 'last_str': word[-1], 6 'used': False, 7 })

投稿2017/11/26 15:07

miyahan

総合スコア3095

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

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

0

まずはじめにpythonは変数名listは予約語であるため使用を推奨されません。
順をおって説明します。
listの要素へアクセスする方法は以下のようにそれぞれのindexでアクセスできます

python

1names = ["スシ", "ビーフシチュー", "ラーメン"] 2 3print(names[0]) 4""" 5>> 'スシ' 6""" 7print(names[1]) 8""" 9>> 'ビーフシチュー' 10"""

文字列が1文字ずつのリストになっていると考えてください。したがって二次元配列のようにアクセスできます。

python

1names = ["スシ", "ビーフシチュー", "ラーメン"] 2 3print(names[0][0]) 4""" 5>> 'ス' 6""" 7print(names[0][1]) 8""" 9>> 'シ' 10"""

[:3]のような書き方はスライスといい、[startindex:endindex]のように書きます。
細いところは以下を参照してみてください。
Qiita Pythonのスライスについて
ただしendindexは終端のindex+1になります。

python

1names = ["スシ", "ビーフシチュー", "ラーメン"] 2 3print(names[0][0:1]) 4""" 5>> 'ス' 6""" 7print(names[0][0:2]) 8""" 9>> 'スシ' 10""" 11# endindex+1以上を指定しても上記と同様の結果になります 12print(names[0][0:3]) 13""" 14>> 'スシ' 15"""

投稿2017/11/26 10:57

編集2017/11/26 11:01
wakame

総合スコア1170

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

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

kinesin_lks

2017/11/26 12:18

回答ありがとうございます。 list内の要素を二次元配列のようにアクセスできるということも把握済みです。 その上で、wakameさんの最後の例で言う、 print(names[0][0:1])で元々正常に「ス」と表示されていたのですが、 途中からコードを変更していないのに「ス」が表示されず、「?」が表示されるようになりました。 半角の「?」が表示されたので、もしかしたら半角で認識しているのでは?と考え、 範囲をnames[0][:1]から、names[0][:3]に変更したところ現在うまいこと「ス」と表示されました。 なぜこうなったのかよくわからなかったので質問いたしました次第です。 説明不足で申し訳ありません。
wakame

2017/11/26 12:40

なるほどこちらのはやとちりだったのですね、スライスの件は了解しました。ちなみにこの現象は同じ手順で実行すると再現しますか?
kinesin_lks

2017/11/26 13:11

今はnanes[0][:3]の方しか再現できません。 片方が再現できる時はもう片方は再現できませんので。 実際のコードを模したものを追記いたしましたので、参考にしていただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問