追記

コメント欄で教えていただきました。id:podhmo さん、ひげさんありがとうございます。

>>>a.extend(b)
[1, 2, 3, 4, 5, 6]
>>>a.append(b)
[1, 2, 3, [4, 5, 6]]

とてもわかりやすいので、今後僕は extend を使います。
見よう見まねで書いたコードで append すべきところで extend 使ってて、
その後 join してたから extend の挙動を完全に間違って覚えてました。


あと、+ でもいいみたいだけど、extend 使う方が意図が明確だし、
これは使わないかもしれない。

>>>a+b
[1, 2, 3, 4, 5, 6]

Python での list の merge

python で list をマージしたい時はどうしたらいいんだろう。
考えるよりまずググる Google 脳なので、「python list merge」でググッたところ、こんな記法が目を引いた。

>>>a = [1,2,3]
>>>b = [4,5,6]
>>>[x for sublist in [a,b] for x in sublist]
[1, 2, 3, 4, 5, 6]

気に入ったけど何のことかわからない。
重い腰を上げて考えます。

まずこの [x for sublist in [a,b]... 最初の x が意味わからない。

分解してみる。

>>> a = [1,2,3]
>>> b = [4,5,6]
>>> [x for sublist in [a,b]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

そりゃそうだ。これは何となくわかる。

>>> [sublist for sublist in [a,b]]
[[1, 2, 3], [4, 5, 6]]

OK、何となくわかった。
結果を想像しながら次。

>>> [a for sublist in [a,b]]
[[1, 2, 3], [1, 2, 3]]

[] の先頭に最終的に list に代入させたいものを書けばよさげ。

>>> [sublist.pop(0) for sublist in [a,b]]
[1, 4]

超便利!!


で、2個目の for の意味もよくわからない。
なんか何個でも for 書いていいみたいだけど。

(例)

>>> [x for sublist in [a,b] for hoge in sublist for x in [hoge]]
[1, 2, 3, 4, 5, 6]

for 文以外書いたら怒られた。
ネズ本読んでたらその内教えてくれるだろうか。

普通に書くならこっちな気がする

もうちょっとググったらもっとわかりやすそうなの出てきた。

>>> from heapq import merge
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> list(merge(a,b))
[1, 2, 3, 4, 5, 6]

こういう時ってどうすればいいんだろう。
php 書く時なら迷わず下を選択するんだけど。