Skip to content

Instantly share code, notes, and snippets.

@astynax
Created July 31, 2013 07:08
Show Gist options
  • Save astynax/6119941 to your computer and use it in GitHub Desktop.
Save astynax/6119941 to your computer and use it in GitHub Desktop.
Python-библиотеки functools, itertools, more_itertools
Display the source blob
Display the rendered blob
Raw
{
"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