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

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

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

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

Q&A

解決済

3回答

5529閲覧

python insertについて

gontaros0302

総合スコア14

Python

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

0グッド

0クリップ

投稿2018/07/07 09:48

"M" "I" "U"の3つの文字を入力から受け取り
もし最初の文字が"M"ならば、それ以外の文字をもう一つ繰り返して表示したいのですが、、、

例えば、
MIU → MIIUU
MUU → MUUUU
MUI → MUUII
MMM → MMMMM
のような感じです。

以下のように書くと、エラーメッセージで

line 52, in <module>
miu.insert(i,miu[i])
AttributeError: 'str' object has no attribute 'insert'

と表示されました。

insertの使いかたが間違っているのか、そもそも条件分岐で間違っているのかもわかりませんが、どなたかご教示いただければと思います。。。

よろしくお願いします。

python

1miu = [] 2miu = input("M,I,Uを好きな順に入力して下さい(3文字以内で):") 3 4if miu.startswith("M"): 5 for i in range(1,len(miu)): 6 miu.insert(i,miu[i]) 7 print(miu)

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

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

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

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

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

guest

回答3

0

miu = [] miu = input("M,I,Uを好きな順に入力して下さい(3文字以内で):")

上記の部分に問題があります。

以下を実行すると、 miu に入っていたlistがinput関数で取得したstrに上書きされます。

miu = input("M,I,Uを好きな順に入力して下さい(3文字以内で):")

strにはinsertメソッドがないので、エラーが出ています。

投稿2018/07/08 03:27

mtb_beta

総合スコア181

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

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

0

ベストアンサー

python

1miu = [] 2miu = input("M,I,Uを好きな順に入力して下さい(3文字以内で):")

の部分でコードの意味がよくわかっていないんじゃないかなぁ、と思います。動的型付け言語ですから上のように書いたところでリスト型で宣言したことにはならず、代入するとオブジェクトへの参照が変更されるのでmiuは普通にstr型になります。

str型はimmutableなので、値を変更することはできません。

その点を改善すると以下のようなコードになりますが、

python

1miu = list(input("M,I,Uを好きな順に入力して下さい(3文字以内で):")) 2 3if miu[0] == "M": 4 for i in range(1,len(miu)): 5 miu.insert(i,miu[i]) 6 print("".join(miu))

このロジックは、insertするたびに場所がずれていくのに、何もinsertしない状態で決めたrange(1,len(miu))に基づいて挿入しているため、バグがあります。whileで書いてカウンタで工夫すればなんとかなるかもしれませんが、より安直にもう一つリストを作り、こう書いた方が良いのではないでしょうか。

python

1miu = input("M,I,Uを好きな順に入力して下さい(3文字以内で):") 2lst = [] 3if miu[0] == "M": 4 lst.append(miu[0]) 5 for c in miu[1:]: 6 lst.extend([c,c]) 7 print("".join(lst))

投稿2018/07/07 10:06

hayataka2049

総合スコア30933

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

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

gontaros0302

2018/07/08 09:13

上側の『insertするたびに場所がずれていく』というのは例えば、 入力がMIUの場合 入力値のインデックスはM[0] I[1] U[2]となるから 1回目のfor文で[1]のIをinsertし、MIIUとなり MIIUのインデックスはM[0] I[1] I[2] U[3]だから 2回目のfor文で[2]のIが指定されるからまたIがinsertされ 最終的に、MIIIUという出力になってしまうということですかね?
hayataka2049

2018/07/08 11:07 編集

投稿ミスにつき削除
guest

0

insertはlistのメソッドなので、miu = list(miu)すれば使えます。
ただし、ループ中に対象を操作する現状の方法では、想定通りには動作しないでしょう。

代替策としては、例えばこんな方法が考えられます。

Python

1if miu.startswith('M'): 2 print('M', end='') 3 for ch in miu[1:]: 4 print(ch*2, end='') 5 6 print()

投稿2018/07/07 09:57

編集2018/07/07 10:00
LouiS0616

総合スコア35658

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問