{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "***\n", "# 10. 리스트의 활용\n", "***\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 1 리스트 정렬하기\n", "***" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-1 리스트의 sort 메소드\n", "- L.sort() 함수는 리스트 L 자체를 변경하며 리턴값을 반환하지 않는다." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "[1, 2, 3, 4, 5, 8, 9]\n" ] } ], "source": [ "L = [1, 5, 3, 9, 8, 4, 2]\n", "print(L.sort())\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 파이썬2에서는 cmp(a,b) 내장 함수가 지원되었으나,\n", "- 파이썬3부터는 cmp(a,b) 내장 함수가 지원되지 않는다." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'cmp' is not defined", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# compare\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNameError\u001b[0m: name 'cmp' is not defined" ] } ], "source": [ "# compare\n", "print(cmp(1,2))\n", "\n", "print(cmp(5,2))\n", "\n", "print(cmp('abc', 'abc'))\n", "\n", "\n", "# -1\n", "# 1\n", "# 0" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1\n", "1\n", "0\n" ] } ], "source": [ "# cmp(a, b)\n", "# if a < b: return -1\n", "# if a > b: return 1\n", "# if a == b: return 0\n", "def cmp(a, b):\n", " return (a > b) - (a < b) # True - False. 1 - 0. \n", "\n", "print(cmp(1, 2))\n", "\n", "print(cmp(5, 2))\n", "\n", "print(cmp('abc', 'abc'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Python3: 기본 정렬 방식을 변경할 수 없다." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 5, 3, 2, 4, 6]\n" ] }, { "ename": "TypeError", "evalue": "'cmp' is an invalid keyword argument for this function", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: 'cmp' is an invalid keyword argument for this function" ] } ], "source": [ "def mycmp(a, b): # 대소관계에 따른 순서를 반대로 바꾸었음\n", " return cmp(b, a)\n", "\n", "L = [1, 5, 3, 2, 4, 6]\n", "print(L)\n", "L.sort(cmp=mycmp) # 역순으로 정렬" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 여러 튜플을 요소로 지닌 리스트인 경우, 튜플의 첫번째 값이 아닌 다른 위치에 있는 값을 기준으로 정렬 " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n" ] }, { "ename": "TypeError", "evalue": "'cmp' is an invalid keyword argument for this function", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by name:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 12\u001b[0;31m \u001b[0mL\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcmp\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcmp_1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 13\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'sorted by experience:'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: 'cmp' is an invalid keyword argument for this function" ] } ], "source": [ "#Python2 기준 예제\n", "def cmp_1(a1, a2):\n", " return cmp(a1[1], a2[1])\n", "\n", "def cmp_2(a1, a2):\n", " return cmp(a1[2], a2[2])\n", "\n", "L = [('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "L.sort()\n", "print('sorted by name:', L)\n", "\n", "L.sort(cmp=cmp_1)\n", "print('sorted by experience:', L)\n", "\n", "L.sort(cmp=cmp_2)\n", "print('sorted by age:', L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [중요] **Python3: sort의 인자인 key에 객체가 지닌 원소들 내에 키값을 지정하는 함수 지정가능**\n", " - key 인자에 함수가 할당되어 있으면 각 리스트 원소에 대해 기본 비교함수 호출 직전에 key 함수를 먼저 호출한다. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sorted by name: [('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", "sorted by experience: [('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n" ] } ], "source": [ "#Python3 기준 예제\n", "L = [('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", "def get_key_value(a):\n", " return a[1]\n", "\n", "L.sort()\n", "print('sorted by name:', L)\n", "\n", "L.sort(key=get_key_value)\n", "print('sorted by experience:', L)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sorted by the first character: ['jung', 'kim', 'loh']\n", "sorted by the second character: ['kim', 'loh', 'jung']\n" ] } ], "source": [ "#Python3 기준 예제\n", "S = ['loh', 'kim', 'jung']\n", "\n", "def get_key_value(a):\n", " return a[1]\n", "\n", "S.sort()\n", "print('sorted by the first character:', S)\n", "\n", "S.sort(key=get_key_value)\n", "print('sorted by the second character:', S)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['123', '2345', '34', '56']\n", "['34', '56', '123', '2345']\n" ] } ], "source": [ "L = ['123', '34', '56', '2345']\n", "L.sort()\n", "print(L)\n", "\n", "L.sort(key=int)\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- sort() 함수 인자로 reverse 값을 받을 수 있다.\n", " - 디폴트 reverse 인자값은 False\n", " - reverse 인자값을 True로 주면 역순으로 정렬됨" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9, 8, 6, 6, 3, 2, 1]\n", "[1, 2, 3, 6, 6, 8, 9]\n", "[9, 8, 6, 6, 3, 2, 1]\n", "[1, 2, 3, 6, 6, 8, 9]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "L.sort(reverse=True) # L.sort(reverse = 1)\n", "print(L)\n", "L.sort(reverse=False) # L.sort(reverse = 1)\n", "print(L)\n", "print(L[::-1])\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-2 sorted 내장 함수\n", "- sorted() 내장함수는 L 자체에는 내용 변경 없이 정렬이 되어진 새로운 리스트를 반환한다." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 6, 6, 8, 9]\n", "[1, 6, 3, 8, 6, 2, 9]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "newList = sorted(L)\n", "print(newList)\n", "print(L)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 2 3 6 6 8 9 " ] } ], "source": [ "for ele in sorted(L):\n", " print(ele, end=\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Python2: sorted() 함수의 두번째 인자로 cmp를 지정하는 함수 할당 가능\n", " - 지정된 cmp 함수는 1, 0, -1만 Return\n", " \n", "- Python3: sorted() 함수의 두번째 인자로 key를 지정하는 함수 할당 가능 \n", " - 지정된 key 함수가 할당되어 있으면 각 리스트 원소에 대해 기본 비교함수 호출 직전에 key 함수를 먼저 호출한다." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "mycmp() missing 1 required positional argument: 'a2'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mL\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msorted\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmycmp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# 역순으로 정렬\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mL\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;31m# ['123', '2345', '34', '56']\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: mycmp() missing 1 required positional argument: 'a2'" ] } ], "source": [ "def mycmp(a1, a2): # 대소관계에 따른 순서를 반대로 바꾸었음\n", " return cmp(a2, a1)\n", "\n", "L = [1, 5, 3, 2, 4, 6]\n", "print(sorted(L, key=mycmp)) # 역순으로 정렬\n", "print(L)\n", "# ['123', '2345', '34', '56']\n", "# ['34', '56', '123', '2345']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('jung', 10, 36), ('kim', 3, 28), ('lee', 5, 38)]\n", "[('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", "[('kim', 3, 28), ('lee', 5, 38), ('jung', 10, 36)]\n", "[('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n" ] } ], "source": [ "#Python3 기준 예제\n", "L = [ ('lee', 5, 38), ('kim', 3, 28), ('jung', 10, 36)]\n", "\n", "def get_key_value(a):\n", " return a[1]\n", "\n", "print(sorted(L))\n", "print(L)\n", "\n", "print()\n", "\n", "print(sorted(L, key=get_key_value))\n", "print(L)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['jung', 'kim', 'loh']\n", "['loh', 'kim', 'jung']\n", "\n", "['kim', 'loh', 'jung']\n", "['loh', 'kim', 'jung']\n", "loh\n", "kim\n", "jung\n" ] } ], "source": [ "#Python3 기준 예제\n", "S = ['loh', 'kim', 'jung']\n", "\n", "def get_key_value(a):\n", " return a[1]\n", "\n", "print(sorted(S))\n", "print(S)\n", "\n", "print()\n", "\n", "print(sorted(S, key=get_key_value))\n", "print(S)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 인자로 reverse와 key 지정 가능" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9, 8, 6, 6, 3, 2, 1]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "print(sorted(L, reverse=True))" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['123', '2345', '34', '56']\n", "['34', '56', '123', '2345']\n", "['2345', '123', '56', '34']\n" ] } ], "source": [ "L = ['123', '34', '56', '2345']\n", "print(sorted(L))\n", "\n", "print(sorted(L, key=int))\n", "\n", "print(sorted(L, key=int, reverse=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1-3 L.reverse() 와 reversed() 내장 함수\n", "- L.reverse()도 반환값이 없다.\n", " - 즉, L 자체를 역순으로 뒤집는다.\n", " - [주의] 역순 정렬이 아니다." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "[9, 2, 6, 8, 3, 6, 1]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "print(L.reverse())\n", "print(L)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11 4 8 10 5 8 3 \n", "[1, 6, 3, 8, 6, 2, 9]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "L.reverse() # 역순으로 뒤집는다.\n", "for ele in L:\n", " print(ele + 2, end=\" \")\n", "\n", "print()\n", "L.reverse() # 다시 원상태로 복귀시킨다.\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- reversed() 내장함수는 sorted() 처럼 내용이 뒤집힌 리스트를 반환한다.\n", " - sorted() 처럼 원래 리스트 내용에는 변함없다." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 6, 3, 8, 6, 2, 9]\n", "11 4 8 10 5 8 3 \n", "[1, 6, 3, 8, 6, 2, 9]\n" ] } ], "source": [ "L = [1, 6, 3, 8, 6, 2, 9]\n", "print(L)\n", "for ele in reversed(L):\n", " print(ele + 2, end=\" \")\n", "print()\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "***\n", "## 2 리스트 내포(List Comprehension)\n", "***\n", "- 다음은 고등학교 수학에서 배운 집합의 표기 방법이다.\n", " - A = {x^2 | x in {0, ..., 9}}\n", " - B = {1, 2, 4, 8, 16, ..., 2^16}\n", " - C = {x | x in S and x is odd}\n", "\n", "- 파이썬의 리스트 내포(list comprehension)는 바로 위 집합 표기법과 유사한 방식의 리터럴이다. \n", "- 위 집합들을 리스트 내포 방식으로 표현하면 다음과 같다. \n", " - A = [x**2 for x in range(10)]\n", " - B = [2**i for i in range(17)]\n", " - C = [x for x in S if x % 2 == 1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 일반적인 리스트 생성법" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] } ], "source": [ "L = []\n", "\n", "for k in range(10):\n", " L.append(k*k)\n", " \n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위 코딩은 리스트 내포 리터럴 방식을 활용해서 아래와 같이 변경할 수 있다." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]\n" ] } ], "source": [ "L = [k * k for k in range(10)]\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 리스트 내포 리터럴\n", "
\n",
    "[expression for expr1 in sequence1\n",
    "              for expr2 in sequence2 \n",
    "              ...\n",
    "              for exprN in sequenceN\n",
    "              if condition]\n",
    "
\n", "\n", "- 위 리터럴은 다음의 일반적인 for 문의 리털러과 동일\n", "
\n",
    "l = []\n",
    "for expr1 in sequence1:\n",
    "  for expr2 in sequence2:\n",
    "      ...\n",
    "         for exprtN in sequenceN:\n",
    "            if condition:\n",
    "               l.append(expression)\n",
    "
\n", " \n", " \n", "- expression의 평가 결과 반드시 한 개의 원소가 나와야 한다.\n", " - 틀린 예: [ x, y for x in seq1 for y in seq2 ]\n", " \n", "- 만약 두 개의 이상의 평가 결과가 나오면 튜플 등으로 감싸 주어야 한다.\n", " - 올바른 예: [ (x, y) for x in seq1 for y in seq2 ]\n", " \n" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 9, 25, 49, 81]\n" ] } ], "source": [ "L = [k * k for k in range(10) if k % 2] # 홀수의 제곱만 리스트로 형성\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 위의 리스트 내포 코드는 아래와 동일" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 9, 25, 49, 81]\n" ] } ], "source": [ "L = []\n", "for k in range(10):\n", " if k % 2:\n", " L.append(k*k)\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 두 개의 시퀀스 자료형에 대해 각각의 원소에 대한 쌍을 튜플 형태로 만들면서 리스트에 저장하는 코드" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" ] } ], "source": [ "seq1 = 'abc'\n", "seq2 = (1, 2, 3)\n", "print([(x, y) for x in seq1 for y in seq2])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]\n" ] } ], "source": [ "seq1 = 'abc'\n", "seq2 = (1, 2, 3)\n", "l = []\n", "for x in seq1:\n", " for y in seq2:\n", " l.append((x, y))\n", "print(l) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 20보다 작은 2의 배수와 3의 배수에 대해 그 두 수의 합이 7의 배수인 것들에 대해 그 두 수의 곱을 출력하는 코드" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(2, 12, 24), (4, 3, 12), (6, 15, 90), (8, 6, 48), (10, 18, 180), (12, 9, 108), (16, 12, 192), (18, 3, 54)]\n" ] } ], "source": [ "L = [(i, j, i*j) for i in range(2, 20, 2) for j in range(3, 20, 3) if (i + j) % 7 == 0]\n", "print(L)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 문장 내 단어의 길이 출력" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']\n", "['THE', 'the', 3]\n", "['QUICK', 'quick', 5]\n", "['BROWN', 'brown', 5]\n", "['FOX', 'fox', 3]\n", "['JUMPS', 'jumps', 5]\n", "['OVER', 'over', 4]\n", "['THE', 'the', 3]\n", "['LAZY', 'lazy', 4]\n", "['DOG', 'dog', 3]\n" ] } ], "source": [ "words = 'The quick brown fox jumps over the lazy dog'.split()\n", "print(words)\n", "stuff = [[w.upper(), w.lower(), len(w)] for w in words]\n", "\n", "for i in stuff:\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 피타고라스 삼각형의 각 3변의 길이 리스트 (조건: 각 변 x, y, z의 길이는 30 보다 작아야 하며, x <= y <= z 이어야 함)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(3, 4, 5), (5, 12, 13), (6, 8, 10), (7, 24, 25), (8, 15, 17), (9, 12, 15), (10, 24, 26), (12, 16, 20), (15, 20, 25), (20, 21, 29)]\n", "[[ 3 4 5]\n", " [ 5 12 13]\n", " [ 6 8 10]\n", " [ 7 24 25]\n", " [ 8 15 17]\n", " [ 9 12 15]\n", " [10 24 26]\n", " [12 16 20]\n", " [15 20 25]\n", " [20 21 29]]\n", "(10, 3)\n" ] } ], "source": [ "import numpy as np\n", "\n", "k = [(x,y,z) for x in range(1,30) for y in range(x,30) for z in range(y,30) if x**2 + y**2 == z**2]\n", "print(k)\n", "k = np.array(k)\n", "print(k)\n", "print(k.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- QUIZ. shape(Channel, Height, Width)이 (3, 4, 5)인 3차원 배열을 리스트내포를 활용하여 만드시오(elements의 값은 CxHxW)." ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [3, 6, 9, 12, 15], [4, 8, 12, 16, 20]],\n", " [[2, 4, 6, 8, 10], [4, 8, 12, 16, 20], [6, 12, 18, 24, 30], [8, 16, 24, 32, 40]],\n", " [[3, 6, 9, 12, 15], [6, 12, 18, 24, 30], [9, 18, 27, 36, 45], [12, 24, 36, 48, 60]]]\n", "8\n", "(3, 4, 5)\n" ] } ], "source": [ "from pprint import pprint\n", "import numpy as np\n", "\n", "x = [[[c*h*w for w in range(1, 5+1)] for h in range(1, 4+1)] for c in range(1, 3+1)]\n", "pprint(x, width=200)\n", "\n", "print(x[1][1][1])\n", "# x = [i+10 if i % 2 == 0 else i+20 for i in range(10)]\n", "# print(x)\n", "\n", "x = np.array(x)\n", "print(x.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일

" ] } ], "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.6.8" } }, "nbformat": 4, "nbformat_minor": 1 }