LoginSignup
6
8

More than 5 years have passed since last update.

pythonの内包表記について

Posted at

はじめに

pythonには内包表記という形式があるのですが、
一切使わずに今までやってきたのですがパフォーマンスにも関係するし、そろそろきちんと理解しようかと思いまとめようと思いました。

リストを作る

1~100までの奇数だけのリストを作ります。
内包表記を使わない作り方は以下の通り

list1.py
list = []
for number in range(1,101):
    if number % 2 ==1:
        list.append(number)
print(list)

次は内包表記を使って同じことをやってみます。プログラムは以下の通り

list2.py
list = [number for number in range(1,101) if number %2 ==1]
print(list)

初めのnumberはlistに格納するnumberになります。for のあとのnumberはfor分の一部のnumberです。

集合を作る

1~99までの奇数だけの集合を作ります。
リストと同じような感じで内包表記でかけます。

shugo.py
list = {number for number in range(1,101) if number %2 ==1}
print(list)

辞書を作る

同じように辞書も内包表記を使ってかけます。
wordの文字が何回現れたかカウントするプログラムです

jisyo.py
word = 'aiueokakiku'
word_count = {x:word.count(x) for x in word}
print(word_count)

タプルについて

リストと同じように作ってみます。

tuple1.py
tuple = (number for number in range(1,101) if number %2 ==1)
print(tuple)

実行すると
<generator object <genexpr> at 0x101435f61>
エラーではないが、()を使ってかくとジェネレータが返ってくる
つまり、タプルには内包表記がないわけです。

パフォーマンス比較

本当に早いのか試してみます。
まずは、内包表記を使わずに1~10000000までの奇数だけのリストを作ってみます

test1.py
import time
start = time.time()

list = []
for number in range(1,10000001):
    if number % 2 ==1:
        list.append(number)

print("実行時間:{0}",time.time() - start)

5回実行した平均は1.71131701469となりました

次に同じこと内包表記でやってみます

test2.py
import time
start = time.time()

list = [number for number in range(1,10000001) if number %2 ==1]

print("実行時間:{0}",time.time() - start)

5回実行した平均は0.88413858413となりました

結果

内包表記で書くと早さも約2倍で単純にコード量が減りました。
慣れてくると読みやすくなるらしいので早く慣れるように頑張ろうと思います。

6
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8