Skip to content

Instantly share code, notes, and snippets.

@ksomemo
Last active March 18, 2017 02:51
Show Gist options
  • Save ksomemo/47696bc73bb82d5e4432 to your computer and use it in GitHub Desktop.
Save ksomemo/47696bc73bb82d5e4432 to your computer and use it in GitHub Desktop.
iteratorと参照を活かしたリストの分割 ref: http://qiita.com/ksomemo/items/7b0016e1758ac10bf61a
zip(*[iter(s)]*n)
[iter([1,2,3])]*4
# [<list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>]
zip(*[iter([1,2,3])]*4)
# => zip(0x103fb7048, 0x103fb7048, 0x103fb7048, 0x103fb7048)
@ksomemo
Copy link
Author

ksomemo commented Mar 18, 2017

iteratorと参照を活かしたリストの分割

zipのdocumentに書いてあった

http://docs.python.jp/3.4/library/functions.html?highlight=zip#zip

zip(*[iter(s)]*n)

iter

iteratorオブジェクトに包んで、iterateするごとに要素を返すようにする

zip

pythonのzipは可変長引数なので、3つ以上でも問題ない

iterとzip

  • iteratorオブジェクトの参照を複製する(つまり全部のitereatorは同じiteratorを指す)
  • unpackしながらzipに渡す
  • 1つ目のiteratorをiterateすると、あたりまえだけど他の参照も1つ目の要素を返したことになる -> (1,
  • zipはそれぞれのiteratorを代わる代わるiterateする
  • 2つ目のiteratorをiterateすると、2つ目の要素を返したことになる -> (1, 2,
  • 3つ目のiteratorをiterateすると、3つ目の要素を返したことになる -> (1, 2, 3)
  • 1つタプルが完成する
  • 終わるまで処理する
[iter([1,2,3])]*4
# [<list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>,
# <list_iterator at 0x103fb7048>]

zip(*[iter([1,2,3])]*4)
# => zip(0x103fb7048, 0x103fb7048, 0x103fb7048, 0x103fb7048)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment