{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Действия со списками\n", "Списки можно изменять, они умеют намного больше, чем другие последовательности.\n", "\n", "Создание списка:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n", "[5, 6, 7]\n", "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "['a', 'b', 'c']\n", "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] } ], "source": [ "a = [10, 20, 30] # перечисление\n", "# list() от любой последовательности\n", "print(list()) # пустой\n", "tup = 5, 6, 7 # кортеж\n", "print(list(tup))\n", "print(list(range(10)))\n", "print(list(\"abc\"))\n", "# еще есть генераторы списков, см. позже\n", "print([x ** 2 for x in range(10)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Все действия со списками](https://docs.python.org/3/library/stdtypes.html#mutable-sequence-types)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a\n", "a\n", "['x', 'b', 'c']\n" ] } ], "source": [ "s = \"abc\"\n", "l = ['a', 'b', 'c']\n", "print(s[0])\n", "print(l[0])\n", "#s[0] = 'x' # строки неизменяемые\n", "l[0] = 'x' # так можно\n", "print(l)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'b']\n", "['A', 'B', 'C', 'c']\n" ] } ], "source": [ "l = ['a', 'b', 'c']\n", "print(l[0:2])\n", "l[0:2] = ['A', 'B', 'C']\n", "print(l)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10, 20, 30, 42]\n" ] } ], "source": [ "l = [10, 20, 30]\n", "l.append(42) # добавить в конец\n", "print(l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Копирование:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1000, 20, 30]\n", "[1000, 20, 30]\n", "[10, 20, 30]\n" ] } ], "source": [ "l1 = [10, 20, 30]\n", "l2 = l1\n", "l3 = l1.copy() # l1[:] эквиваленто, слайс создает новое\n", "l1[0] = 1000\n", "print(l1)\n", "print(l2)\n", "print(l3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Дописывание в конец списка:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10, 20, 30, 40, 50]\n", "[10, 20, 30]\n" ] } ], "source": [ "l = [10, 20, 30]\n", "r = l\n", "l = l + [40, 50]\n", "print(l)\n", "print(r) # l был присовоен новый список из l из [40, 50]" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10, 20, 30, 40, 50]\n", "[10, 20, 30, 40, 50]\n" ] } ], "source": [ "l = [10, 20, 30]\n", "r = l\n", "l += [40, 50] # или l.extend([40, 50])\n", "print(l)\n", "print(r) # l изменен" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сортировка, пока будем сортировать только в естественном поряке, т.е. числа по возрастанию, строки в алфавитном порядке" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[14, 52, 84, 3, 40, 22]\n", "[3, 14, 22, 40, 52, 84]\n", "[3, 14, 22, 40, 52, 84]\n", "['aaasdfasdf', 'aab', 'ooo', 'z']\n" ] } ], "source": [ "l = [14, 52, 84, 3, 40, 22]\n", "# создает отсортированный список из любого перечисления\n", "r = sorted(l)\n", "print(l) # sorted не изменяет l\n", "print(r)\n", "\n", "l.sort() # сортировать сам l, т.е. l изменится\n", "print(l)\n", "\n", "# у строк алфавитный порядок, как в словаре\n", "print(sorted([\"aab\", \"aaasdfasdf\", \"ooo\", \"z\"]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функция `join` для соединения списка строк через указанный разделитель:" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10+20+30\n", "a b c\n" ] } ], "source": [ "print(\"+\".join(['10', '20', '30']))\n", "print(\" \".join('abc'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Генераторы списков (List comprehension)\n", "Это еще один способ создавать списки. Вы берете какую-то последовательность (список, кортеж, range, строка, ...), преобразуете каждый элемент по какому-то правилу и отфильтровываете часть элементов:\n", "\n", "`[_выражание_с_x_ for x in _последовательность_]`\n", "\n", "`[_выражание_с_x_ for x in _последовательность_ if _условие_на_x_]`\n", "\n", "Примеры:" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11, 21, 31]\n" ] } ], "source": [ "L = [10, 20, 30]\n", "print([x + 1 for x in L])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "переменная `x` перебрала все элементы последовательности, для каждого элемента вычислила `x + 1` и собрала все результаты в новый список." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[100, 400, 900]\n", "['10', '20', '30']\n", "[11, 21]\n" ] } ], "source": [ "L = [10, 20, 30]\n", "print([x ** 2 for x in L])\n", "print([str(x) for x in L]) # будет список строк\n", "\n", "# теперь при переборе избавимся от всех x >= 25\n", "print([x + 1 for x in L if x < 25])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'b', 'c', 'd', 'e']\n", "['aa', 'bb', 'cc', 'dd', 'ee']\n" ] } ], "source": [ "# строки тоже последовательности\n", "print([c for c in \"abcde\"]) # аналогично list(\"abcde\")\n", "print([c * 2 for c in \"abcde\"]) # аналогично list(\"abcde\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Вложенные циклы в генераторе списков:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['ABC', 'XYZ', 'PQR']\n", "['a', 'b', 'c', 'x', 'y', 'z', 'p', 'q', 'r']\n", "['a from abc', 'b from abc', 'c from abc', 'x from xyz', 'y from xyz', 'z from xyz', 'p from pqr', 'q from pqr', 'r from pqr']\n", "['a from abc', 'b from abc', 'c from abc', 'x from xyz', 'z from xyz']\n" ] } ], "source": [ "L = [\"abc\", \"xyz\", \"pqr\"]\n", "print([word.upper() for word in L])\n", "print([c for word in L for c in word])\n", "print([f'{c} from {word}' for word in L for c in word])\n", "print([f'{c} from {word}'\n", " for word in L\n", " if word[0] != 'p'\n", " for c in word\n", " if c != 'y'\n", " ])" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[30, 90, 77]\n", "[11, 21, 41, 51, 34, 45]\n" ] } ], "source": [ "L = [[10, 20], [40, 50], [33, 44]]\n", "print([sum(line) for line in L])\n", "print([num + 1 for line in L for num in line])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.7.3" } }, "nbformat": 4, "nbformat_minor": 4 }