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

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

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

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

Q&A

解決済

2回答

6422閲覧

Pythonのリスト内包表記とmap関数の使い分けについて

kon_ta

総合スコア81

Python

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

0グッド

2クリップ

投稿2017/01/01 14:05

###Pythonのリスト内包表記とmap関数の使い分け
Pythonでプログラムを書く際に、例として各リストの中に16進数の値が格納されていて、
それぞれの先頭の0xの文字を削除したい場合などに方法として、
・リスト内包表記
arr = [a.strip("0x”) for a in arr]

・map関数の利用
arr = map(lambda a :a.strip('0x'),arr)

の以上2通りがあると思います。(arrは16進数が文字列として格納されているリストとします)

この場合、どちらを使うほうが一般的なのでしょうか。
使い分けをする場合、どのような場合にそれぞれ使うのか、それぞれの方式にどのようなメリット・デメリット
があるのかをご教授して頂ければ幸いです。

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

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

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

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

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

guest

回答2

0

見た目の問題が大きい。
単純な文字数の差に加えて前者は読まなくてもいい部分が多い。
"for a in" は極端な話「意味」を持たないのでこれは読み流せる。
リスト内包表記に慣れていれば[]とarrとa.strip()のイディオムでそのコードの「意味」を十分読み取れる(勿論コードの品質がひどくないという前提があるけど)
一方mapのほうはlambda故に左から順々に読んでいかなければ「意味」が読み取れないし事実やや文字数が多いい。つまり「情報」が余計に多いしその上その情報に「順序性」を欠いている。(つまり前者は「a.strip()」の値を格納したリストであることが一番初めの段階でわかる。)

この意味で個人的には「生成」には基本的には内包表記を用い、一方、「リストの要素を繰り返し処理して、その副産物として返り値のリストを生成する」というコーディングパターンの時には後者を使う。なぜなら「リスト内包表記」はあくまで「リストを生成する」表記法だから。その内部で副作用のあるコードが実行されるのならば、リスト内包表記はこの「副作用」の意味合いを隠蔽しがちだし、これがごっちゃになれば逆にリスト内包表記を見るたびに「副作用」を疑わなくてはならなくなる。要するところ、「一貫性」がともかく重要であとは「驚き最小」を考えてそのうえで採用するならどんな記法でも構わないと思いまする。

投稿2017/01/01 16:04

henpon

総合スコア40

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

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

0

ベストアンサー

これは意見が分かれる問題かもしれません。
なのでこれは私が勝手に思う意見として受け取ってください。

内包表記: リストを生成する。単純なリスト内のデータの変更をする。
map関数: (Python3の場合)リソースを節約するために使う。複雑な処理をワンラインで書きたい場合に使う。

なぜmap関数を使った場合はリソースの節約になるかというと、pythonの内包表記を少し詳しく - Qiitaによると、

map,filterと内包表記はアウトプットが近く、よく比較されます。

また、python 2系ではmap,filterはリストを返すため、リスト内包表記と対応します。
python 3系ではmap,filterオブジェクトというイテレータを返すため、ジェネレータと対応します。

とのことですので、リストでドカンとメモリを食われるよりは、呼ばれる度に演算して値を返すジェネレータを使ったほうが良いこともあると思います。
※ですが、ジェネレーター式という、内包表記の[]を()に書き換えてジェネレータを生成する方法も在ります。

ここまで私の理解できる範囲で説明しましたが、
結局のところソースコード全体を見渡して、
「これは関数型プログラミングのアプローチを取っている」
ということをはっきりしたい場合はmapを使い、そうでない場合は内包表記を使ったほうが良いのではないかなと思います。

うやむやな結論で申し訳ございません。


参考資料

投稿2017/01/01 15:23

manzyun

総合スコア2244

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問