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

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

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

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

Q&A

解決済

1回答

353閲覧

内包表記をする場合としない場合のコードが理解できません。

Moco

総合スコア7

Python

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

0グッド

0クリップ

投稿2022/09/25 13:06

前提

pythonで天気予報サイトの情報をスクレイピングで取得するプログラムを作成しています。
参考サイトを元に作成中ですが、「内包表記」について理解できず困っております。
内包表記について理解を深めたく、敢えて内包表記をしない場合のコードを自分で考えた際に、わからなくなりました。
該当のソースコードに、内包表記をした場合、内包表記をしない場合のコード(自分で考えた)を掲載します。

実現したいこと

該当ソースコードに記載されてる「内包表記済コード」を、「内包表記しない場合のコード」に書き換える時のコードを学びたいです。

該当のソースコード

Python

1#################内包表記済コード################################################ 2 soup = BeautifulSoup(r.text, "html.parser") 3 rs = soup.find(class_="入力値は消しました。") 4 rs = [i.strip() for i in rs.text.splitlines()]#1 5 rs = [i for i in rs if i != ""]#2 6################################################################################### 7#################内包表記しない場合を自分で考えたコード############################## 8#1を分解 9rs = [] 10for i in rs.text.splitelines(): 11 rs.append(i.strip()) 12#2を分解 13rs = [] 14for i in rs: 15 if(i != ""): 16 rs.append(i) 17################################################################################### 18######################内包表記について調べた時に学んだコード######################### 19#内包表記をする場合 20result= [i**2 for i in range(5)] 21print(result) 22# [0, 1, 4, 9, 16] 23 24#内包表記しない場合 25result= [] 26for i in range(5): 27 result.append(i**2) 28 29print(result) 30# [0, 1, 4, 9, 16]

試したこと

「#1を分解」「#2を分解」において、rs = []によってrsを空リストに定義している為、rs.text.splitlines()やrsを取得できない事は理解してます。
内包表記をする手順、内包表記をしない場合について調べた手順(「内包表記について調べた時に学んだコード」)に沿って書いた結果、該当のソースコードのようになり、作動しません。
「内包表記済コード」を、「内包表記しない場合のコード」に書き換える時のコードをご教示いただきたく存じます。

長文・駄文失礼しました。
分かりにくい質問文かと思いますが、お力添えいただきたく存じます。何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

別の変数に代入しておいて、最後に元の変数に代入すればいいですよ。

py

1#1を分解 2tmp = [] # 一時変数 3for i in rs.text.splitelines(): 4 tmp.append(i.strip()) 5rs = tmp 6del tmp # 一時変数削除 7#2を分解 8tmp = [] # 一時変数 9for i in rs: 10 if(i != ""): 11 tmp.append(i) 12rs = tmp 13del tmp # 一時変数削除

投稿2022/09/25 13:14

編集2022/09/25 14:19
shiracamus

総合スコア5406

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

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

Moco

2022/09/25 13:50

ご回答いただき、誠にありがとうございます。 ご教示いただいたコードはとてもわかりやすく、理解する事ができました。 しかし、「内包表記済コード」の内包表記を分解すると、「内包表記しない場合を自分で考えたコード」で示したように、毎回、rs = []によってrsを空リストに定義しているように読み取れます。 いただいたコードはrs1,rs2と別変数を用意している為、かなりわかりやすいです。 ですが、「内包表記済コード」は別変数を用意しておらず、一体どのようにして作動しているのかが、いまいちまだ理解できません。 「内包表記済コード」をそのまま「内包表記しない場合のコード」に書き換える事はできますでしょうか? 何卒よろしくお願いいたします。
shiracamus

2022/09/25 22:49 編集

内包表記ではrs変数に代入することなくオブジェクトを作ります(内部で一時変数を使っていると思われます)。オブジェクトを作ったあとrs変数に代入します。 内包表記を使わない場合、変数を用意してappendしていかなければなりませんから、元の変数名とは異なる一時変数を用意する必要があります。 それが「内包表記済コード」をそのまま「内包表記しない場合のコード」になります。
Moco

2022/09/25 23:03

再度のご回答をいただき、誠にありがとうございます。 「内部で一時変数を使っている」という言葉と、編集していただいたコードのおかげで、一気に理解できました。 下記が解釈した内容です。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 内包表記の流れ(言語化)↓ 内包表記においては、内部で一時変数の空リストを用意し、そこに任意値をappendしていく。 そして、全ての値がappendされたリストを、rs変数に代入。 内包表記の流れ(コード+言語化)↓ rs = [i.strip() for i in rs.text.splitlines()]#1 rs = [i for i in rs if i != ""]#2 #1: 一時変数として用意した空リストに、「i.strip()」したものを一つずつappend。そして、全ての値がappendされた一時変数リストを、変数rsに代入。 #2: 一時変数として用意した空リストに、「i」を一つずつappend。そして、全ての値がappendされた一時変数リストを変数rsに代入。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー 以上のように解釈しました。この解釈に問題はございませんでしょうか。
Moco

2022/09/26 11:59

おかげ様で理解する事ができ、大変嬉しい気持ちです。 何度もご丁寧な回答をしていただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問