map/zip/filter オブジェクトに対して、list を2回やると空っぽになります。
list_twice
>>> xs = [1, 2, 3]
>>> mapped = map(lambda x:x+1, xs)
>>> list(mapped)
[2, 3, 4]
>>> list(mapped)
[]
最初何が起こったのかわからずバグじゃないかとか、破壊的メソッドか!?などと思ったりしたわけですが、仕様らしいです。http://stackoverflow.com/questions/19759247/listing-a-filter-object-twice-will-return-a-blank-list
なので適当に書いてはいけない
もともとは以下のように dict を作ったところでハマりました。
bad_code
xs = map(func, my_list)
ys = dict(zip([x.key for x in xs], xs))
今読み返すと悲しいコードですが・・・ list() を使わなくても内包表記だろうがなんだろうが iterate すると消えてしまうので、この場合 zip の2番めの xs は空っぽになってしまったのでした。なので、map した場合は注意するように頑張ることにしました。
ちなみに上のコードは、以下のようにして解決しました。
bad_code
xs = map(func, my_list)
ys = {x.key:x for x in xs}
おかげで Python3 では、内包表記が dict と set に対応してるというのを学びました。