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

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

ただいまの
回答率

90.04%

整数と文字と改行コードが混ざったリストを文字だけのリストにしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 67

Koshikake

score 2

前提・実現したいこと

Python3の初心者です。
正の整数と、アルファベット、改行コード(\n)が混ざった要素をもつリストがあります。整数は1桁とは限りません。リストの例を示します。
list_a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']
このリストから、数字と改行コードを取り除き、アルファベットだけの要素をもつリストにしたいです.
実現したいリストは['apple', 'banana', 'cherry', 'dragonfruits']となります。

発生している問題・エラーメッセージ

コードを書きましたが、以下のエラーがでてきます(ファイル名だけ変えています)

Traceback (most recent call last):
File "XXXX.py", line 7, in <module>
for i in list:
TypeError: 'type' object is not iterable

更新しました
Traceback (most recent call last):
File "XXXX.py", line 4, in <module>
list_b[i]=re.sub(r"\d","",list_a[i])
TypeError: list indices must be integers or slices, not str

該当のソースコード

list_a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']
import re
for i in list_a:
list_b[i]=re.sub(r"\d","",list_a[i])
list_c[i]=re.sub(r"\n","",list_b[i])
print(c)

更新しました

import re
for i in list_a:
    list_b[i]=re.sub(r"\d","",list_a[i])
    list_c[i]=re.sub(r"\n","",list_b[i])
    print(c)


更新しました。このコードでうまくいきました。

a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']
import re
for i in a:
    b=re.sub(r"\d","",i)
    c=re.sub(r"\n","",b)
    print(c)

試したこと

リストではなく、個々の要素に対して
import re
a=re.sub(r"\d","","1apple\n")
print(a)
とするとエラーが出ないので、for文を使う方法が間違っているのかなと考えています。

補足情報(FW/ツールのバージョンなど)

windows10を使用しています。コードを書いて確かめるのはIDLEを使っています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Koshikake

    2019/11/09 17:11

    ありがとうございました。print(i)とすると、1appleとなり、iがそのまま要素を示すことがわかりました。
    この結果をもとにコードを書き直したところ、うまくいきました。list_aなどという表記は間違えのもとなので書き直しました。うまくいったコードを質問のところに更新します。有用なアドバイスを頂き大変感謝しています。

    キャンセル

  • LouiS0616

    2019/11/09 17:12

    こういういわゆるprintデバッグというのはすごく原始的なんですけど、それだけでも案外様々な気付きが得られるものです。今後も何か詰まりましたら試してみて下さい。

    解決されたようで何よりです。
    回答欄にできるだけ詳しく解決方法を書き、自己解決として本質問をクローズしておいて下さい。

    キャンセル

  • Koshikake

    2019/11/09 17:17

    ありがとうございます。大変助かりました。今後ともよろしくお願いいたします。

    キャンセル

回答 1

check解決した方法

+1

以下のコードはうまくいきませんでした。

list_a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']

import re
for i in list_a:
    list_b[i]=re.sub(r"\d","",list_a[i])
    list_c[i]=re.sub(r"\n","",list_b[i])
    print(list_c)


実行すると以下のようなエラーが出ました。

Traceback (most recent call last):
File "XXXX.py", line 5, in <module>
list_b[i]=re.sub(r"\d","",list_a[i])
TypeError: list indices must be integers or slices, not str

コードの中のfor文で使用している"i"が示すものを明らかにするために、
for文の次の行にprint(i)を加えました。

list_a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']

import re
for i in list_a:
    print(i)


コードを実行したところ、現れてきたのはリストの要素でした(以下)

1apple

23banana

34cherry

4567dragonfruits

すなわち、 
list_b[i]=re.sub(r"\d","",list_a[i])という煩雑なコードではなく、

list_b=re.sub(r"\d","",i)とシンプルにすれば良いことがわかりました。

また、list_a,list_bという表現はコードの記述にあたって間違いやすいため

以下のコードに書き換えました。

a=['1apple\n', '23banana\n', '34cherry\n', '4567dragonfruits\n']
import re
for i in a:
    b=re.sub(r"\d","",i)
    c=re.sub(r"\n","",b)
    print(c)


このコードを実行したところ、

apple
banana
cherry
dragonfruits

という結果が得られました。
大変勉強になりました。ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る