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

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

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

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

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

Q&A

解決済

1回答

384閲覧

python3 リスト内包表記[i for i in list1 if '.csv' in i] の意味

Sython0811

総合スコア1

JupyterLab

JupyterLabは、Jupyter notebookの後継の対話型開発環境(IDE)です。データの可視化がインタラクティブで、プラグイン作成により新しいコンポーネントの追加および既存のコンポーネントも統合可能。サーバに閉じているため、データ分析に向いています。

Python 3.x

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

0グッド

0クリップ

投稿2022/09/04 14:50

前提

ただのpythonのコーディングの練習
JupyterLab(Python3)環境でlist化してあるファイル名から特定の拡張子のファイルだけのlistを作りたい

実現したいこと

list1 = [
'1.txt', '1.csv',
'2.txt', '2.csv',
'3.txt', '3.csv'
]
からcsvだけを選んで
csv_list = [
'1.csv', '2.csv', '3.csv'
]
を作る

質問

csv_list = [i for i in list1 if '.csv' in i]
で目的の結果は得られるが、このリスト内包表記で何が起こっているのか理解できないためどんな手順で何が行われているのかを教えてほしい

該当のソースコード

python3

1list1 = [ 2'1.txt', '1.csv', 3'2.txt', '2.csv', 4'3.txt', '3.csv' 5] 6#list1から「.csv」を含む要素だけを抽出してcsv_listに入れる 7csv_list = [i for i in list1 if '.csv' in i] 8print(csv_list) 9 10#>>['1.csv', '2.csv', '3.csv']

思考開示

[i for....]のiってなんで書かなきゃいけないんだろう
for i in list1....list1に含まれている文字列を順番にiに代入していく
if '.csv' in i...iに'.csv'が含まれているならば・・・という意味になるのであろう('*.csv'とせずになぜ部分一致になるのかは分からない)

是非ともよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

lst = [a for b in c if d] は、次のように書いているのと同じように動作します。

Python

1lst = [] 2for b in c: 3 if d: 4 lst.append(a)

[i for....]のiってなんで書かなきゃいけないんだろう

上記の例で言うと、常に a = b としたいとは限らないからです。

for i in list1....list1に含まれている文字列を順番にiに代入していく

ご認識のとおりです。

if '.csv' in i...iに'.csv'が含まれているならば・・・という意味になるのであろう('*.csv'とせずになぜ部分一致になるのかは分からない)

文字列をオペランドにとる in 演算子は部分一致を判定します。
ワイルドカードを使った判定は全体一致が前提なので、その違いです。

部分一致なので file.csv.txtとかもマッチします。
これを避けたいならば i.endswith('.csv') を条件に用いるのが良いでしょう。

投稿2022/09/04 15:12

編集2022/09/04 15:14
LouiS0616

総合スコア35660

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

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

Sython0811

2022/09/04 15:26

for in :で書き換えて戴いてありがとうございました。理解出来ました。 部分一致の部分のフィルタリングの改良についても追記ありがとうございます。勉強になります。 早く解答できる側になれるよう頑張ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問