別に Python がリストしか使えない訳ではない
以下の例も,numpy ndarray などを使うとか,しかるべき関数を使えばリスト内包表記など使わなくてもできる話である。
しかしなぜか,「リスト内包表記はすごいんだぜ!」的な上から目線の記事が多いので,そうでもないよねというのを書いてみる。
# full_name = "Yamada Taro"
# characters = [char for char in full_name]
fullname = "Yamada Taro"
characters = split(fullname, "")
# Matrix = [[7, 1, 5],
# [22, 99, 0],
# [33, 2, 57]]
# row_min = [min(row) for row in Matrix]
M = [7 1 5; 22 90 0; 33 2 57]
rowmin = minimum(M, dims=2)
# People = ["Taro", "Jiro", 'Wan', "Elepahnt", "Tomas", "ken", "sae"]
# target = [name for name in People if len(name) < 4 and name.islower()]
people = ["Taro", "Jiro", "Wan", "Elepahnt", "Tomas", "ken", "sae"]
select(s) = (length(s) < 4) & all("a" .<= split(s, "") .<= "z")
target = people[select.(people)]
# Genius = ["taro", "jiro", "yamada", "ito"]
# target = [name.capitalize() for name in Genius]
genius = ["taro", "jiro", "yamada", "ito"]
target = titlecase.(genius)
# People = ["Taro", "Hiroyuki", "ken", "youu"]
# answer = [name if name.startswith('y') else 'Not Genius' for name in People]
people = ["Taro", "Hiroyuki", "ken", "youu"]
starts(s) = (s[1] == 'y') + 1
answer = ["not Genius", "youu"][starts.(people)]
# Genius = ["taro", "jiro", "yamada"]
# L = []
# for name in Genius:
# for char in name:
# L.append(char)
genius = ["taro", "jiro", "yamada"]
split(join(genius), "")
# People = ["Kenny", "Tomas", "tom", "young"]
# L = map(lambda a: a.lower(), People)
people = ["Kenny", "Tomas", "tom", "young"]
select(s) = all("a" .<= split(s, "") .<= "z")
L = lowercase.(people)
# L1 = filter(lambda a: len(a) < 4, People)
# L2 = [a for a in People if len(a) < 4]
people = ["Kenny", "Tomas", "tom", "young"]
L2 = people[length.(people) .< 4]
リスト内包表記とジェネレータのメモリー使用量
# large_list = [x for x in range(1_000_000)] # 8697440
# large_list_g = (x for x in range(1_000_000)) # 96
Base.summarysize(collect(1:1000000))
Base.summarysize(1:1000000)
# list_2d = [
# [0, 0, 0],
# [1, 1, 1],
# [2, 2, 2],
# ]
# flat = [num ** 2 if num % 2 == 0 else num for row in list_2d for num in row]
# list_2d = [
# [0, 0, 0],
# [1, 1, 1],
# [2, 2, 2],
# ]
# flat = []
# for row in list_2d:
# for num in row:
# flat.append(num ** 2 if num % 2 == 0 else num)
list2d = [0 0 0; 1 1 1; 2 2 2]
flat = vec(list2d' .^ 2)
いかがでしたでしょうか。リスト内包表記は記述法としてはわかりにくい(そもそも同じ処理を書いても,長くなりがち。長いプログラムはそれだけでよくない)。
対して,ベクトル処理できる関数で対処できる Julia は,関数名を見ただけでもわかる。R も Julia と同じ感じ(だからリスト内包表記などない)。Julia では,内包表記もできる(が,使う局面は少ない)