{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# На лекции мы писали и выполняли этот код в PyCharm.\n", "# В ipython3 notebook мы не сможем ничего подать на стандартный ввод.\n", "# Для воспроизведения результата скопируйте фрагмент кода в отдельный файл и запустите его" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import sys" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Читаем ввод построчно, печатаем длину каждой введенной строки\n", "# Для завершения ввода надо ввести Ctrl+D в Linux, Ctrl+Z в Windows (End of file)\n", "for line in sys.stdin:\n", " line = line.rstrip() # Обрезаем завершающий перевод строки (и все пробельные символы)\n", " print(len(line))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Сортируем строки ввода\n", "\n", "lines = []\n", "for line in sys.stdin:\n", " line = line.rstrip(\"\\n\") # Обрезаем только завершающий перевод строки\n", " lines.append(line)\n", "\n", "lines.sort()\n", "\n", "for line in lines:\n", " print(line)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "# То же самое, но компактнее:\n", "\n", "lines = sys.stdin.read().split(\"\\n\")\n", "print(\"\\n\".join(sorted(lines)))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Подсчет числа слов в тексте\n", "\n", "words = {}\n", "\n", "for line in sys.stdin:\n", " line = line.strip()\n", " for word in line.split(\" \"):\n", " words[word] = words.get(word, 0) + 1\n", "\n", "for word in words:\n", " print(word, words[word])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Пусть теперь слова надо отсортировать по убыванию частоты\n", " \n", "words = {}\n", "\n", "for line in sys.stdin:\n", " line = line.strip()\n", " for word in line.split(\" \"):\n", " words[word] = words.get(word, 0) + 1\n", "\n", "pairs = [(words[key], key) for key in words] # Список пар вида (частота, слово)\n", "\n", "pairs.sort(reverse=True) # Сортируем пары по убыванию\n", "\n", "for frequency, word in pairs:\n", " print(word, frequency)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "# Пусть теперь в текстовом файле нам поступают числа.\n", "# Простая задача: в каждой строке вводится по одному целому числу, надо найти сумму\n", "\n", "s = 0\n", "\n", "for line in sys.stdin:\n", " s += int(line)\n", "\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 3 10\n", "1 10 2 3\n" ] } ], "source": [ "# Что если числа вводятся через пробел в одной строке?\n", "\n", "numbers = input().split(\" \")\n", "numbers.sort()\n", "print(\" \".join(numbers))\n", "# Здесь мы числа 1, 2, 3, 10 отсортируем неправильно (лексикографически)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 10 3 14\n", "1 2 3 10 14 " ] } ], "source": [ "# Для правильной сортировки надо строки превратить в числа\n", "\n", "# Первый вариант\n", "parts = input().split(\" \")\n", "for i in range(len(parts)):\n", " parts[i] = int(parts[i])\n", "\n", "parts.sort()\n", "\n", "for number in parts:\n", " print(number, end=\" \")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 10 3 14\n", "1 2 3 10 14\n" ] } ], "source": [ "# Второй вариант\n", "parts = input().split(\" \")\n", "parts = list(map(int, parts))\n", "\n", "parts.sort()\n", "\n", "print(\" \".join(map(str, parts)))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 1.4142135623730951, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.8284271247461903]\n" ] } ], "source": [ "# Вот еще пример с map\n", "import math\n", "\n", "s = [1, 2, 3, 4, 5, 6, 7, 8]\n", "\n", "print(list(map(math.sqrt, s)))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6\n", "720\n" ] } ], "source": [ "# Функции\n", "def factorial(n):\n", " if n == 0:\n", " return 1\n", " return n * factorial(n - 1)\n", "\n", "x = int(input())\n", "print(factorial(x))\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "720\n" ] } ], "source": [ "# Функции - такие же объекты, как и все остальное\n", "# Например, можно сделать так:\n", "g = factorial\n", "print(g(6))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]\n" ] } ], "source": [ "print(list(map(factorial, range(10))))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Вернемся к задаче о подсчете числа слов\n", "# Как отсортировать список пар (слово, частота) сразу по частоте?\n", "\n", "words = {}\n", "for line in sys.stdin:\n", " line = line.strip()\n", " for word in line.split(\" \"):\n", " words[word] = words.get(word, 0) + 1\n", "\n", "def rev(pair):\n", " return pair[::-1]\n", "\n", "pairs = list(words.items())\n", "\n", "pairs.sort(reverse=True, key=rev) # key - функция получения \"ключа\" сортировки\n", "# Если key задан, то при сортировке будут сравниваться не сами элементы, а их ключи\n", "\n", "for word, freq in pairs:\n", " print(word, freq)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Функцию rev можно было бы определить прямо в месте использования как лямбда-функцию\n", "\n", "words = {}\n", "for line in sys.stdin:\n", " line = line.strip()\n", " for word in line.split(\" \"):\n", " words[word] = words.get(word, 0) + 1\n", "\n", "pairs = list(words.items())\n", "\n", "pairs.sort(reverse=True, key=lambda pair: pair[::-1]) \n", "\n", "for word, freq in pairs:\n", " print(word, freq)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, -1, 2, -3, 4, -5, 18]\n" ] } ], "source": [ "# Еще примеры сортировок с ключом\n", "s = [1, 4, -5, 2, 0, -3, 1, 18, -1]\n", "s.sort(key=abs) # сортируем по модулю\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 1, -1, 2, -3, 4, -5, 18]\n" ] } ], "source": [ "s = [1, 4, -5, 2, 0, -3, 1, 18, -1]\n", "s.sort(key=lambda x: x * x) # сортируем по квадрату\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-5, 0, -3, -1, 1, 1, 2, 4, 18]\n" ] } ], "source": [ "s = [1, 4, -5, 2, 0, -3, 1, 18, -1]\n", "s.sort(key=lambda x: x if x > 0 else 0) # сортируем по хитрому ключу\n", "print(s)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[6, 9, 0, 7, 5, 2, 6, 23, 4]\n" ] } ], "source": [ "# Ответ на вопрос: как с помощью lambda-функции зафиксировать аргумент?\n", "def f(x, y):\n", " return x + y\n", "\n", "s = [1, 4, -5, 2, 0, -3, 1, 18, -1]\n", "s = list(map(lambda x: f(x, 5), s)) # заменили каждый элемент x на f(x, 5) (то есть, x + 5)\n", "print(s)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }