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

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

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

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

Q&A

解決済

2回答

696閲覧

【python】リストの特定のインデックス番号の要素を削除したい

banao

総合スコア13

Python 3.x

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

0グッド

0クリップ

投稿2019/08/01 07:57

前提・実現したいこと

python初心者です。インデックス番号が2,5,8,11...と3の倍数-1の要素だけ削除したいです。
良い解法が出せないので困っています。
一応全体のソースコードを載せますが、一番下のところだけが問題だと思います。
wordsには318個の要素が入っています。

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

--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-32-ca1e62ab6cf2> in <module> 1 num = 2 2 for i in words: ----> 3 del words[num] 4 num += 3 IndexError: list assignment index out of range

該当のソースコード

from urllib import request from bs4 import BeautifulSoup import csv url = "https://yattoke.com/2019/03/04/english-tools-word/" html = request.urlopen(url) soup = BeautifulSoup(html,"html.parser") #英単語があるセルを抽出 word_cells = soup.find_all("td") #コンテンツを抽出 words = [] for word_cell in word_cells: words.append(word_cell.text) print(words) num = 2 for i in words: del words[num] num += 3

試したこと

恐らく繰り返しで要素を消していっているので、インデックス番号がずれていっています。
そして、del words[num]の部分で、ずれて存在しなくなったインデックス番号の要素を消そうとしているのでエラーを起こしているのではないかと思います。
一応、

num = 2 for i in words: del words[num] num += 2 if num>213: break print (words)

と書くと期待通りに動くのですが、もっと良い書き方を知りたいです。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようにリスト内包表記で欲しいものだけ抽出すればよいかと思います。

Python

1l = ['s{}'.format(i) for i in range(10)] 2print(l) # ['s0', 's1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9'] 3 4l = [v for i,v in enumerate(l) if (i+1)%3 != 0] 5print(l) # ['s0', 's1', 's3', 's4', 's6', 's7', 's9']

投稿2019/08/01 08:06

can110

総合スコア38262

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

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

0

Python

1for i in words: 2 del words[num]

通常ループに使用しているオブジェクトを、ループ内で消す作業をしてはいけません。

下記の様にしましょう

Python

1import copy 2words_copy=copy.deepcopy(words) 3 4for i in words: 5 del words_copy[num]

投稿2019/08/01 08:03

yamato_user

総合スコア2321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問