Created
July 31, 2013 07:08
-
-
Save astynax/6119941 to your computer and use it in GitHub Desktop.
Python-библиотеки functools, itertools, more_itertools
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "(func|iter)tools" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "# \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0438 \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 **Python**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u0442\u0443\u0442 \u0443 \u043d\u0430\u0441 \u0438\u043c\u043f\u043e\u0440\u0442\u044b\nimport itertools as it\nimport more_itertools as mit\nimport functools as ft\nfrom random import randrange, choice # \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 1 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "### \u043f\u0430\u0440\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u044d\u0442\u0438\u043c \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432\ndef p(iterable, upto=20):\n \"\"\"\u0412\u044b\u0432\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0434\u043e @upto \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430\"\"\"\n print list(\n it.islice(iterable, upto)\n if upto else iterable)\n\n# \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\ndef generate(min_len=3, max_len=10):\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\n \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 [0-9a-f] \u0438 \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u0434\u043b\u0438\u043d\u0443 @min_len..@max_len\"\"\"\n rng = range(min_len, max_len + 1)\n while True:\n yield ''.join(\n choice('abcdef0123456789')\n for _ in xrange(randrange(min_len, max_len + 1)))\n\n# \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\np(generate(), 5)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "['fe474f1e', '59aa5', '1b0f724a2', '75d95ad2d4', '475251a2']\n" | |
} | |
], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "# functools" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# import functools as ft", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 3 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "\u041d\u0430\u0448\u0438 \u0434\u0440\u0443\u0437\u044c\u044f:\n\n- **partial**\n- **wraps**\n- **total_ordering**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# c partial \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e\ndef repeat(s, n):\n return s * (n + 1)\np(\n map(\n ft.partial(repeat, \"*\"), # \u0442\u0443\u0442 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 repeat \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438)\n range(5)))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "['*', '**', '***', '****', '*****']\n" | |
} | |
], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 wraps \u041a\u0420\u0410\u0419\u041d\u0415 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0434\u0435\u043a\u043e\u0440\u0430\u0442\u043e\u0440\u043e\u0432\ndef printer(fn):\n @ft.wraps(fn) # wraps \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435(\u0438\u043c\u044f, \u043c\u043e\u0434\u0443\u043b\u044c, docstring) \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u043e\u0431\u0451\u0440\u0442\u043a\u0443\n def inner(*args, **kwargs):\n res = fn(*args, **kwargs)\n print \"Result -> %s\" % res\n return res\n return inner\n\n@printer\ndef f(x,y):\n \"\"\"\n \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f!\n \"\"\"\n return x + y\n\nf(10, 11)\nhelp(f) # \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u043c\u0435\u0441\u0442\u0435!", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "Result -> 21\nHelp on function f in module __main__:\n\nf(*args, **kwargs)\n \u041e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f!\n\n" | |
} | |
], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "@ft.total_ordering\nclass Color(object):\n \"\"\"\u0426\u0432\u0435\u0442 \u0440\u0430\u0434\u0443\u0433\u0438\"\"\"\n RED, ORANGE, YELLOW, GREEN, BLUE, NAVY_BLUE, PURPLE = _values = list(enumerate(\n '\u041a\u0440\u0430\u0441\u043d\u044b\u0439 \u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439 \u0416\u0435\u043b\u0442\u044b\u0439 \u0417\u0435\u043b\u0435\u043d\u044b\u0439 \u0413\u043e\u043b\u0443\u0431\u043e\u0439 \u0421\u0438\u043d\u0438\u0439 \u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439'.split()\n ))\n\n def __init__(self, value):\n assert value in self._values\n self._value_idx, self._value_name = value\n\n def __repr__(self):\n return self._value_name\n\n # \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \"==\" \u0438 \"<\"\n # \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043d\u0430 \u0432\u044b\u0432\u0435\u0434\u0435\u0442 total_ordering\n def __eq__(self, other):\n return isinstance(other, self.__class__) and (self._value_idx == other._value_idx)\n def __lt__(self, other):\n return isinstance(other, self.__class__) and (self._value_idx < other._value_idx)\n\n# \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b\nred, orange, yellow, green, blue, navy, purple = map(\n lambda x: Color(getattr(Color, x)),\n ['RED', 'ORANGE', 'YELLOW', 'GREEN', 'BLUE', 'NAVY_BLUE', 'PURPLE'])\n\n# \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\nif (\n red < orange < green < purple > blue >= blue\n and\n yellow == Color(Color.YELLOW) # \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0440\u0430\u0437\u043d\u044b\u0435, \u043d\u043e \u0441\u0443\u0442\u044c \u043e\u0434\u043d\u0430\n and\n blue != navy\n):\n print \"\u0412\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e! (\u043f\u043e\u043a\u0430)\"\n\nprint sorted([blue, red, Color(Color.ORANGE), purple, green, yellow, red, navy])", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "\u0412\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e! (\u043f\u043e\u043a\u0430)\n[\u041a\u0440\u0430\u0441\u043d\u044b\u0439, \u041a\u0440\u0430\u0441\u043d\u044b\u0439, \u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439, \u0416\u0435\u043b\u0442\u044b\u0439, \u0417\u0435\u043b\u0435\u043d\u044b\u0439, \u0413\u043e\u043b\u0443\u0431\u043e\u0439, \u0421\u0438\u043d\u0438\u0439, \u0424\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439]\n" | |
} | |
], | |
"prompt_number": 6 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "# itertools" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# import itertools as it", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 7 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0442\u0430\u0440\u044b\u0445 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445:\n - **imap**, **starmap!**\n - **izip**\n - **ifilter**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u0432\u0441\u0451 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u043d\u0438\u0432\u043e\np(\n it.imap(\n lambda (n, s): s * n,\n it.ifilter(\n lambda (n, s): n > 0,\n it.izip(\n [-5, 0, 3, 7, -2, -10, 0, 2, 1],\n \"abcdefghijklmnopqrstuvwxyz\"))))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "['ccc', 'ddddddd', 'hh', 'i']\n" | |
} | |
], | |
"prompt_number": 8 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "**starmap** \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440\u044b (\u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b) \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a **map** \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 *n* \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 \u0438\u0437 *n* \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "def fn(*args):\n fmt, data = args[0], args[1:]\n return '%r\\t%% %r\\t-> %s' % (fmt, data, fmt % data)\n\nprint \"--- (i)map ---\"\nfor s in it.imap(\n fn,\n ['%08d', '%2.3f'], # \u0434\u0432\u0430 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435)\n [100142, 3.14159] # \"\u0441\u0442\u043e\u043b\u0431\u0446\u0430\" \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\n):\n print s\n\nprint\nprint \"--- starmap ---\"\nfor s in it.starmap(\n fn,\n [ # \u043e\u0434\u0438\u043d(!) \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u0430\u0431\u043e\u0440\u043e\u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432\n ('%08d', 100142),\n ('%d/%d', 3, 14),\n ('#%02X%02X%02X', 255, 127, 15), # \u043d\u0430\u0431\u043e\u0440\u044b \u0440\u0430\u0437\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b!\n ]\n):\n print s", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "--- (i)map ---\n'%08d'\t% (100142,)\t-> 00100142\n'%2.3f'\t% (3.14159,)\t-> 3.142\n\n--- starmap ---\n'%08d'\t% (100142,)\t-> 00100142\n'%d/%d'\t% (3, 14)\t-> 3/14\n'#%02X%02X%02X'\t% (255, 127, 15)\t-> #FF7F0F\n" | |
} | |
], | |
"prompt_number": 9 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b:\n - **count**\n - **chain**\n - **cycle**\n - **repeat**\n - **combinations/permutations**\n - **product**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.count(10, 5)\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105]\n" | |
} | |
], | |
"prompt_number": 10 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.chain(xrange(3), \"asdasdsd\")\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[0, 1, 2, 'a', 's', 'd', 'a', 's', 'd', 's', 'd']\n" | |
} | |
], | |
"prompt_number": 11 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.cycle(\"abc\")\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b']\n" | |
} | |
], | |
"prompt_number": 12 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.repeat(42)\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42]\n" | |
} | |
], | |
"prompt_number": 13 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.combinations(\"ADTF\", 2)\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[('A', 'D'), ('A', 'T'), ('A', 'F'), ('D', 'T'), ('D', 'F'), ('T', 'F')]\n" | |
} | |
], | |
"prompt_number": 14 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.product([1,2,3], \"abc\")\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[(1, 'a'), (1, 'b'), (1, 'c'), (2, 'a'), (2, 'b'), (2, 'c'), (3, 'a'), (3, 'b'), (3, 'c')]\n" | |
} | |
], | |
"prompt_number": 15 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u0440\u0430\u0437\u0440\u044f\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432\nsmile = set([(1, 1), (3, 1), (0, 3), (4, 3), (1, 4), (2, 4), (3, 4)])\n\ndef render(data, width, height):\n return '\\n'.join(\n it.imap(''.join, (\n ([' ', '*'][(x, y) in data] for x in xrange(width))\n for y in xrange(height))))\n\nprint render(smile, 5, 5)\n\n# \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b-\u0432\u0430 \u0442\u043e\u0447\u0435\u043a \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\npoints_in_area = lambda data, (x0, y0), (x1, y1): sum(\n (p in data)\n for p in it.product(\n xrange(x0, x1 + 1),\n xrange(y0, y1 + 1)))\n\nprint\nprint \"%s \u0442\u043e\u0447\u0435\u043a \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \\\"\u0440\u043e\u0442\\\" \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0430\" % points_in_area(smile, (0, 2), (4, 4))\n ", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": " \n * * \n \n* *\n *** \n\n5 \u0442\u043e\u0447\u0435\u043a \u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442 \"\u0440\u043e\u0442\" \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0430\n" | |
} | |
], | |
"prompt_number": 16 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b:\n - **islice**\n - **dropwhile**\n - **takewhile**\n - **compress**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(it.islice(xrange(100), 5, 15, 4))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[5, 9, 13]\n" | |
} | |
], | |
"prompt_number": 17 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "gt_0 = lambda x: x < 0\np(it.takewhile(gt_0, xrange(-10, 10)))\np(it.dropwhile(gt_0, xrange(-10, 10)))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1]\n[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" | |
} | |
], | |
"prompt_number": 18 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.compress(\n it.count(),\n it.cycle([1, 0, 1, 0, 0]))) # \u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[0, 2, 5, 7, 10, 12, 15, 17, 20, 22, 25, 27, 30, 32, 35, 37, 40, 42, 45, 47]\n" | |
} | |
], | |
"prompt_number": 19 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u043f\u0440\u043e\u0447\u0435\u0435:\n - **tee**\n - **groupby**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "def frame(iterable, size=2):\n \"\"\"\u0421\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u0439 \u0431\u0443\u0444\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 @size\"\"\"\n res = []\n for i in xrange(size):\n i, iterable = it.tee(iterable)\n res.append(i)\n iterable.next()\n return it.izip(*res)\n\ndef sliding_avg(source, buf_len):\n \"\"\"\u0421\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 @source \u0443\u0441\u0440\u0435\u0434\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0431\u0443\u0444\u0435\u0440\u0443 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 @buf_len\"\"\"\n avg = lambda x: float(sum(x)) / buf_len\n return it.imap(avg, frame(source, buf_len))\n\np(\n sliding_avg(\n # \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,10)\n it.imap(lambda _: randrange(0, 10), it.count()),\n buf_len=20,\n )\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[4.65, 4.6, 4.65, 4.95, 5.25, 5.1, 5.25, 5.1, 5.15, 5.5, 5.35, 4.9, 4.7, 4.75, 4.65, 4.45, 4.1, 3.85, 3.85, 3.85]\n" | |
} | |
], | |
"prompt_number": 20 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "data = sorted(\n it.islice(\n generate(min_len=1),\n 100),\n key=len)\n\ndict(it.imap(\n lambda (x, y): (x, list(y)),\n it.groupby(data, len)))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "pyout", | |
"prompt_number": 21, | |
"text": "{1: ['9', 'b', '4', '7', 'e', '8', '3', 'd', 'd', '1', 'a', '2'],\n 2: ['bb', '0c', '3d', '75', '08', 'b1', '6c', '83', '77', '2a'],\n 3: ['73a',\n '210',\n 'c23',\n 'b36',\n '74d',\n 'ac3',\n 'ca8',\n '30c',\n 'de7',\n 'a22',\n '42d',\n 'bf9'],\n 4: ['c4c7', '3b3a', 'df50', 'c971', 'a22a', '4873', '196c', 'a547'],\n 5: ['f21fb',\n '8c833',\n '9dc39',\n 'd499d',\n '1cd4a',\n '0f09b',\n '3e622',\n '76247',\n '85295',\n '80418'],\n 6: ['18de45',\n '365293',\n 'ad2367',\n '832cc4',\n 'd680a4',\n '555a8e',\n '982b76',\n 'bed813',\n 'c7e023',\n '1bac6c',\n '49a2c0'],\n 7: ['b37b8b4', 'c6367ea', 'b77db1f', '0d6e5ff'],\n 8: ['1821efa7',\n 'acd32b48',\n '40591bd5',\n '423e4e74',\n 'cdcd5799',\n '33f514e1',\n '913d71cb',\n '3d89274d'],\n 9: ['5925a45bf',\n 'bd22a1201',\n 'cdb34486f',\n 'c71726d83',\n 'a68789b5a',\n '6503b1303',\n '7d8336679'],\n 10: ['735bbd62e3',\n '71d2519e4c',\n '2a4a802cd1',\n 'a57cf7c0af',\n 'd1dc411dfc',\n 'e6c4f0b943',\n '573451370c',\n '10a22ee3b0',\n '7d9cd79951',\n '9c8ba360d8',\n '9e6eed013b',\n 'c5239b89d6',\n 'e67e19fb54',\n '1df10f0654',\n '86c9449df5',\n '9dabc36169',\n 'db41cafb78',\n 'f663bd3c10']}" | |
} | |
], | |
"prompt_number": 21 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "# Moar itertools" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "import more_itertools as mit", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 22 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0441\u0442\u0438:\n - **chunked(grouper)**\n - **collate**\n - **flatten**\n - **iterate**\n - **repeatfunc**\n - **peekable**\n - **roundrobin**" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n mit.chunked(xrange(10), 3)\n)\np(\n mit.grouper(3, xrange(10), None)\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]\n[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, None, None)]\n" | |
} | |
], | |
"prompt_number": 23 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "print ''.join(\n mit.collate(\n sorted(\"ada78huh18jkashd\"),\n sorted(\"86daseqfr3657\")\n )\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "1356677888aaaadddefhhhjkqrssu\n" | |
} | |
], | |
"prompt_number": 24 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n mit.flatten(\n [[1,2,3,4,5], [10, 20, 30], [400, 500]]))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[1, 2, 3, 4, 5, 10, 20, 30, 400, 500]\n" | |
} | |
], | |
"prompt_number": 25 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n it.imap(\n lambda x: x[0],\n mit.iterate(\n lambda (a, b): (b, a + b),\n (1, 1))))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]\n" | |
} | |
], | |
"prompt_number": 26 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n mit.repeatfunc(\n randrange, None, 1, 7))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[6, 2, 1, 2, 2, 3, 1, 4, 5, 2, 6, 1, 5, 4, 6, 4, 3, 1, 3, 6]\n" | |
} | |
], | |
"prompt_number": 27 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "def pairwise(source):\n peekable_source = mit.peekable(source)\n for i in peekable_source:\n yield (i, peekable_source.peek())\n\np(\n pairwise(xrange(10))\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)]\n" | |
} | |
], | |
"prompt_number": 28 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "- \u043c\u0435\u043b\u043e\u0447\u0438:\n - **first**\n - **take**\n - **nth**\n - **consume**\n - **padnone**\n - **ilen**\n - **with_iter**\n - ..." | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "print mit.first(\"abc\", None)\nprint mit.first(\"\", None)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "a\nNone\n" | |
} | |
], | |
"prompt_number": 29 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n mit.take(3, it.count(1000)))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[1000, 1001, 1002]\n" | |
} | |
], | |
"prompt_number": 30 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "print mit.nth(\"abcdefg\", 5)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "f\n" | |
} | |
], | |
"prompt_number": 31 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "data = (x for x in xrange(10)) # \u043d\u0435\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\nmit.consume(data, 5) # \u0441\u043b\u0438\u043b\u0438 5 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u044d\u0444\u0438\u0440\np(data)\n", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[5, 6, 7, 8, 9]\n" | |
} | |
], | |
"prompt_number": 32 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "p(\n mit.take(10, mit.padnone(\"abc\"))\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "['a', 'b', 'c', None, None, None, None, None, None, None]\n" | |
} | |
], | |
"prompt_number": 33 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "print mit.ilen(xrange(10))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "10\n" | |
} | |
], | |
"prompt_number": 34 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u043f\u0440\u043e\u0445\u043e\u0434 \u043f\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438,\n# \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u043c (\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430)\n\n# \u043a\u043e\u0434 \u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d, \u0442.\u043a. \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 :)\n# p(\n# it.imap(\n# int,\n# mit.with_iter(\n# open('/dev/random')))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 35 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "## \u041d\u0443 \u0438 \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a \u0435\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432" | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "**chunked** \u0432 \u0432\u0438\u0434\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u044f \u043d\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u043b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e)" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "chunked = lambda iterable, size: (\n it.takewhile(bool, it.imap(list, mit.repeatfunc(it.islice, None, iter(iterable), size)))\n)\nprint list(chunked(xrange(10), 3))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]\n" | |
} | |
], | |
"prompt_number": 36 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f \"\u043f\u0440\u043e\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043d\u0438\u044f\" \u0434\u0430\u043d\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "do = lambda x, *tups: reduce(lambda x, tup: tup[0](x, *tup[1:]), tups, x)\ndo_last = lambda x, *tups: reduce(lambda x, tup: tup[0](*(tup[1:] + (x,))), tups, x)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 37 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f\nprint do(\n \" hello, world ? \",\n (str.strip,),\n (str.split,),\n (' '.join,),\n (str.capitalize,),\n (str.replace,'?','!')\n)", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "Hello, world !\n" | |
} | |
], | |
"prompt_number": 38 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "# \u0438 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d\nprint do(\n generate(), # \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438\n (it.islice, 100), # \u0432 \u043a\u043e\u043b-\u0432\u0435 100 \u0448\u0442\u0443\u043a\n (lambda x: sorted(x, key=len),), # \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u0434\u043b\u0438\u043d\u0435 (\u0442\u0443\u0442, \u0443\u0432\u044b, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f keyword-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 lambda)\n (it.groupby, len), # \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u0434\u043b\u0438\u043d\u0435 \u0436\u0435\n (dict,), # \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\n (dict.keys,), # \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u043b\u044e\u0447\u0438\n (set,) # \u0432 \u0432\u0438\u0434\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430\n), \"<- \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u0438\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\"", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "set([3, 4, 5, 6, 7, 8, 9, 10]) <- \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u0438\u043d \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\n" | |
} | |
], | |
"prompt_number": 39 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": "\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0443 \u0432\u0435\u0440\u0441\u0438\u044e **chunked** \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:" | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": "chunked = lambda iterable, size: do_last(\n iterable, # \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n (iter,), # \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0432 \u043d\u0435\u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\n (lambda x: mit.repeatfunc(it.islice, None, x, 3),), # \u0440\u0430\u0437 \u0437\u0430 \u0440\u0430\u0437\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c islice,\n (it.imap, list), # \u0444\u043e\u0440\u0441\u0438\u0440\u0443\u044f \u043b\u0435\u043d\u0438\u0432\u044b\u0435 \u0441\u043b\u0430\u0439\u0441\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043a\u0438,\n (it.takewhile, bool), # \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a\n)\nprint list(chunked(xrange(10), 3))", | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": "[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]\n" | |
} | |
], | |
"prompt_number": 40 | |
} | |
], | |
"metadata": {} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment