[Python] 크롤링 예제. Lv3 자바스크립트 렌더링 크롤링 풀이

본 게시글은 nomade.kr의 문제를 보고 풀이한 게시글입니다.


문제주소

https://askdjango.github.io/lv3/



문제 화면

여기서 list 제목만 출력해 보겠습니다.



1. 페이지 살펴보기

[오른마우스 클릭] - [페이지소스보기]를 선택하여 확인한 결과 자바스크립트로 보내주고 있는 것을 확인하였습니다.

그렇다면 이 자바스크립트를 가지고 와서 출력하면 되겠네요.

주의사항

BeautifulSoup는 해당 자바스크립트 부분을 일반 문자열로 인식하기 때문에 따로 가져와서 출력해줘야 합니다.


1
2
3
4
5
6
import re #정규표현식
import requests
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
print(html)
cs

url을 html에 넣고 text로 출력해보았습니다.


나오긴 나왔지만 모든내용 전체가 나왔습니다.

당연한 결과죠. 이제 이부분을 제가 원하는 name부분만 잘라내 보려고 합니다.



자바스크립트 마지막엔 항상 세미콜론(;)이 있으므로 정규표현식을 사용하여 세미콜론 별로 잘라내 보겠습니다.



2. 단순 정규표현식의 이해

1
2
3
4
5
6
7
8
9
10
11
import re #정규표현식
import requests
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
 
#정규표현식에서 일부만 매칭되길 원하면 search
#정규표현식에서 전부를 매칭되길 원하면 match를 사용
#re.search(r'var courses = ();') # 끝에 있는 ()부분을 뽑아내겠다는 뜻
re.search(r'var courses = (.*);', html) # .: 모든 *:문자열 즉 .* :모든문자열

cs

re.search를 사용하여 html문자열 안에 var courses 의 모든문자열(.*) 을 뽑아내겠다는 뜻입니다.


하지만 None를 리턴했기 때문에 반응이 없습니다.


왜그럴까?

파이썬 re 공식문서 (클릭) 에 보시면


라고 나와있습니다.

이 내용이 무엇이냐면 스페셜 캐릭터가 전부 매칭이 되는데, ' . ' 옵션을 주면 newline까지 같이 포함하게 됩니다.

하지만 이 옵션(' . ')이 없으면 newline를 포함하지 않습니다.


지금 이 스크립트에는 한줄 끝날때마다 개행(newline)가 시작되기 때문에 (' , '때문에) 이 필요한 것입니다.

즉 re.S 옵션을 포함시켜줘야 값을 리턴할 수 있다는 말입니다. 


코드수정

1
2
3
4
5
6
7
import re #정규표현식
import requests
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
 
re.search(r'var courses = (.*);', html, re.S) # re.S를 사용하여 개행을 포함하여 인식한다
cs

re.S를 추가시킨 후 실행해 보겠습니다.



지저분하지만 "name": "개발환경 구축하기"라고 반갑게 맞이하고 있습니다.

디테일하게 깎아보겠습니다.



코드

1
2
3
4
5
6
7
8
9
10
11
12
import re #정규표현식
import requests
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
 
#matched 변수에 저장을 합니다
matched = re.search(r'var courses = (.*);', html, re.S)
 
#group으로 모두 출력하는데 1번째줄부터 출력합니다.
#만약 (0)을 주면 첫째줄인 var courses = [도 출력될것입니다.
print(matched.group(1))
cs

8번째줄부터 12번째줄 수정.

코드설명은 주석을 달았습니다.



group(1)을 사용하여 var courses안의 1번째줄부터 출력된 것을 확인할 수 있습니다.

보시면 모든 세미콜론(;)을 출력했네요.



그러므로 우린 첫번째 세미콜론만 잘라서 출력해보겠습니다.


? 를 사용한 최소매칭

1
2
3
4
5
6
7
8
9
10
import re #정규표현식
import requests
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
 
# ' ? '을 사용하여 최소 매칭을 해줍니다.
matched = re.search(r'var courses = (.*?);', html, re.S)
 
print(matched.group(1))
cs

8번째 줄만 수정


첫번째 세미콜론 까지만 최소매칭되어 출력되었네요!

그렇다면 이부분이 json문자열로 지정할수 있겠죠?



json 문자열로 지정

1
2
3
4
5
6
7
8
9
10
11
12
import re
import requests
import json #json
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
 
matched = re.search(r'var courses = (.*?);', html, re.S)
 
#print를 json_string으로 변경
json_string = matched.group(1)
json.loads(json_string)
cs


json형태로 잘 가져왔습니다.

이제 다왔습니다 이 목록들을 예쁘게 출력해 보겠습니다.


json 예쁘게 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import re
import requests
import json
 
url = 'https://askdjango.github.io/lv3/'
html = requests.get(url).text
matched = re.search(r'var courses = (.*?);', html, re.S)
json_string = matched.group(1)
 
#json을 output_list에 삽입
output_list = json.loads(json_string)
 
#json 차례대로 
for output in output_list:
    print('{name} {url}'.format(**output))
cs



예쁘게 성공했습니다!!




저작자 표시 비영리 변경 금지
Continue Reading

[Django] 프로젝트 초기 세팅 (static에 js, css 넣어 관리하기)

본 실습에 있어 장고의 설치와 프로젝트, 앱만들기가 되어있어야 실습이 가능합니다.

앱과 프로젝트 이름은 사용자 임의대로 만드셔도 무관합니다.


1. 장고설치 바로가기

2. 장고의 앱만들기 바로가기



지금 본 실습은 오픈소스 디자인을 가져와서 장고에 적용하고, css와 JavaScript를 어떻게 관리하는지 알아보는 실습입니다.



아래의 이미지는 제가 가져다가 쓰려는 오픈소스 입니다.

주소를 보시면 제가 다운받아온 디자인 입니다.



이 이미지는 제가 장고에 옮겨서 성공적으로 적용한 이미지입니다.

주소를 보시면 localhost로 되어있죠.



1. 프로젝트 Settings.py에서 세팅하기

INSTALLED_APPS에 자신이 추가한 앱 이름을 추가합니다.



자신이 동적파일 안에 추가할 디렉토리 주소입니다.

이렇게 설정하면 앱안에 static 폴더를 만들고 그안에 js, css 등 폴더별로 정리하면 관리하시기 편합니다.



템플릿의 DIRS 디렉토리를 설정합니다. 고정입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
 
ALLOWED_HOSTS = []
 
 
# Application definition
 
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'account',
    'main',
]
 
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
# 웹페이지에 사용할 정적파일의 최상위 URL경로
STATIC_URL = '/static/'
 
#정적파일이 위치한 경로들을 지정하는 설정 항목
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
 
# List of finder classes that know how to find static files in
# various locations.
'''
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
'''
 
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
 
ROOT_URLCONF = 'SO.urls'
 
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
 
WSGI_APPLICATION = 'SO.wsgi.application'
 
 
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
 
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
 
 
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
 
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
 
 
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
 
LANGUAGE_CODE = 'ko-kr'
 
TIME_ZONE = 'UTC'
 
USE_I18N = True
 
USE_L10N = True
 
USE_TZ = True
cs

저의 settings.py는 이런식으로 초기 세팅을 하였습니다.

디버그부터 드래그했으니 참고해주세요


현재 저의 디렉토리입니다.

2. url 설정하기

2.1 프로젝트 urls.py 세팅하기

사용자가 어떤 url로 들어갔는지 알아야 합니다.
장고에선 하나의 프로젝트 안에 여러가지 앱별로 관리가 되는데요. 그래서 url이 두가지가 있습니다.
(1) 프로젝트가 관리하는 url
그안에
(2) 앱별로 나타내는 url
그래서 결구 url은 프로젝트/앱/..... 이런식으로 가게 됩니다.
그럼 먼저 프로젝트 url부터 살펴보겠습니다.

프로젝트 안의 urls.py입니다.

urlpatterns에 보시면 해당 정규표현식에 맞춰 url을 매핑해주게 되는데요.

main/과

주석처리인  (공백)의 차이점이 무엇이냐면

둘다 똑같이 main이라는 앱을 매핑해줘라 인데 url주소가 틀립니다.

첫번째는 앞에 url이 main으로 들어올경우 main앱으로 가라 이고

두번째는 앞에 아무것도 오지 않으면 바로 main으로 가라 가 되겠습니다.


우린 main을 사용해보겠습니다.

1
2
3
4
5
6
7
8
9
from django.conf.urls import url, include
from django.contrib import admin
from django.shortcuts import redirect
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^main/', include('main.urls', namespace='main')),
    #url(r'^', include('main.urls', namespace='main')),
]
cs




2.2 앱안의 urls.py 세팅하기

앱안의 urls.py로 들어왔습니다.

main프로젝트의 url은 main/    main안에 index는 index 이며


결국 이렇게 설정하게되면 우린 사용자에게 main/index/로 url이 요청들어왔을때 index를 응답하게 되는것이죠


1
2
3
4
5
6
7
8
from django.conf import settings
from django.conf.urls import url, include
from django.conf.urls.static import static
from . import views
 
urlpatterns=[
    url(r'^index/$', views.index, name='index'),
]
cs

index/로 요청이 들어온다면 views.py의 index함수로 찾아가라  라는 뜻입니다.




3. 컨트롤러 views.py 설정하기 

url에서 views.py로 가라고 길을 알려줬으니 우린 이제 views.py를 꾸며볼 차례입니다.


views.py의 모습입니다. 이렇게 함수를 정의해주시면 되며


1
2
3
4
5
6
from django.shortcuts import render
from django.conf import settings
# Create your views here.
 
def index(request):
    return render(request, 'main/index.html')
cs

urls.py에서 index/로 요청이 들어오면,

views.py의 index함수로 가라고 설정했으니 함수이름은 당연히 index겠지요


그리고 별다른 설정없이 우린 페이지 return만 해주겠습니다

그래서 render(request, 템플릿주소)로 응답을 해주면 되겠습니다.



4. 템플릿 만들기

템플릿 네임은 고정입니다.

앱->templates->앱이름->html파일

고정으로 넣어줘야하며 네이밍에 오타가 있으면 템플릿을 찾지 못합니다.

이렇게 템플릿 디렉토리안에 html파일을 넣어주면 views.py에서 render해줬던 내용이 잘 찾아가게 됩니다.



5. static폴더 관리

static폴더는 앱안에 settings.py에서 설정했던대로 static폴더를 넣고 그안에 css, js폴더를 넣어 관리하시면 됩니다.


6. static 사용

사용하시기 전에 {% load staticfiles %}를 입력해주셔야 static에 있는 파일들을 load해옵니다!



index.html에서 사용은 이런식으로 경로를 넣어주시고 사용하시면 됩니다.



경로가 이렇게 잘 맞게 설정하시고 사용하셨더라면 문제없이 잘 출력이 되실겁니다.



잘나오네요!!!

제가 만드는것보다 훨씬 이쁘고 생산적이기 때문에 오픈소스를 사용하려고 합니다 ㅋㅋ

저작자 표시 비영리 변경 금지
Continue Reading

[Python] 네이버 실시간검색어 크롤링 실습

본 포스트는 nomade.kr의 강의를 바탕으로 정리한 포스트입니다.


실습환경 Python Version: 3.6.0



1. 페이지 탐색

이번시간에는 네이버 실시간 검색어를 크롤링해 보겠습니다.

UI를 보면 실시간 급상승과 함께 1~10위, 11~20위 두파트로 나뉘어 집니다.



[오른마우스클릭] - [페이지소스보기]

로 부분을 찾아봅니다.

소스를 보고 유일성을 찾아보겠습니다.



v체크된 class안에 실시간 검색어가 포함되어 있고,

그밑에 <li class="ah_item">마다 검색어가 있으며

검색어는 <span class="ah_k">가 되겠습니다.


우리는 이 힌트를 가지고 크롤링을 해보겠습니다.



2. 크롤링 시작

본 코드는 제가 임의대로 짠것이기 때문에 다를수 있습니다. 하지만 결과는 잘나옵니다.


html코드 출력

requests를 사용하여 html을 응답받아와서 출력합니다.

잘나오네요. 하지만 모든 html코드가 나오기 때문에 잘라내야 합니다.



지금 저는 원하는 부분을 select하기 위해 CSS Selector를 사용할 것입니다.

모르시는분은 (클릭)하셔서 숙지하고 오시면 이해하시기 수월하십니다.



내가 원하는 부분 1차 출력

그래서 저는 BeautifulSoup를 사용하여 select 했습니다.

class의 PM_CL_realtimeKeyword_rolling안에 있는 모든 태그들을 출력해봅니다.

실시간 검색어들끼리 잘 출력이 되었습니다.

자세히보면 span class="ah_k"가 실시간 검색어같으므로 span을 추가로 잘라내봅니다.

.은 해당 class가 포함된 모든 태그를 출력하는 CSS Selector 입니다.



세분화하여 2차출력

PM_CL_realtimeKeyword_rolling안에 span이라는 class의 문자열로 ah_k가 매칭되는 모든 Tag를 불러온다.

즉. PM_CL_realtimeKeyword_rolling안에 ah_k 를 가지고있는 모든 class를 불러오는 뜻입니다.


span별로 아주 잘나오네요. span이란 불필요한 태그들을 잘라내고 싶습니다.

타이틀만 쏙 빼보겠습니다.

 


태그를 제거하고 값만 빼오기 

text를 사용하여 값만 빼오며 enumerate를 사용하여 넘버링까지 했습니다.


소스

1
2
3
4
5
6
7
8
9
10
import requests
from bs4 import BeautifulSoup
 
html = requests.get('https://www.naver.com/').text
soup = BeautifulSoup(html, 'html.parser')
 
title_list = soup.select('.PM_CL_realtimeKeyword_rolling span[class*=ah_k]')
 
for idx, title in enumerate(title_list, 1):
    print(idx, title.text)
cs







보너스! 조금더 디테일하게 꾸며보기

1
2
3
4
5
6
7
8
9
10
import requests
from bs4 import BeautifulSoup
 
html = requests.get('https://www.naver.com/').text
soup = BeautifulSoup(html, 'html.parser')
 
title_list = soup.select('.PM_CL_realtimeKeyword_rolling span[class*=ah_k]')
 
for idx, title in enumerate(title_list, 1):
    print("{}{} {}".format(idx, '위', title.text))
cs



저작자 표시 비영리 변경 금지
Continue Reading

[Python] 자료구조와 파이썬 자료구조

일반적인 자료구조 (Data Structure)란?

자료구조는 전산학에서 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법입니다.

즉 자료를 Data라고 할 수 있으며, 자료(Data)의 집합을 의미하고, 각 원소들이 논리적으로 정의된 규칙에 의해 나열되며 자료에 대한 처리를 효율적으로 수행할 수 있도록 자료를 구분하여 표현한것 이라고 할 수 있습니다.


자료구조를 사용하는 이유?

당연한 이야기겠지만 자료를 더 효율적으로 저장, 관리하기 위하여 사용하고 잘 선택된 자료구조는 실행시간단축, 메모리용량의 절약등의 이익을 볼 수 있습니다.



자료구조의 선택 기준은?

- 자료의 처리시간
- 자료의 활용 빈도
- 자료의 크기
- 프로그램의 용이성
- 자료의 갱신 정도 
  등이 있습니다.


파이썬의 기본 자료구조(revision)

본 파트는 https://wikidocs.net/2845 의 글을 참고하여 정리한 글입니다.


개념: 정수형, 실수형, 문자열등의 데이터(Data 혹은 자료)가 여러개 있을때 효과적으로 관리하는데 사용된다.


파이썬 자료구조의 종류

파이썬에서는 여러가지 자료구조가 있는데 그중 리스트(list), 튜플(tuple), 사전(dict) 형태가 가장 많이 사용됩니다.

정리글 바로가기(클릭해주세요)

1. List

2. Tuple

3. Dict


저작자 표시 비영리 변경 금지
Continue Reading

[Python] 파이썬 List 리스트란? 리스트 예제

1. List란?

파이썬의 자료구조 형태중 하나로 리스트는 값을 나열하는것 이라고 정의할 수 있겠습니다.
또한 List는 시퀀스데이터 이기도 합니다.

시퀀스는 데이터의 순서를 정하는것을 의미합니다.
순서를 가지고 있기 때문에 인덱스(index)를 사용하여 참조할 수 있습니다.
인덱스란 문자열이 있으면 번호를 뜻합니다.
Ex)문자열 인덱싱
a = 'hello' 문자열로 했을때, a[0]을 확인하면 첫번째 문자열인 h가 출력됩니다. 이것을 문자열 인덱싱이라 하며, 시퀀스자료형이기 때문에 가능한 것이죠.


파이썬에서의 시퀀스 자료형은?(순서를 정함)
string, list, tuple

시퀀스 자료형이 아닌것은?(순서를 정하지 않음)
set, dict



1.1 List 만들어보기

1
list_name = [1,2,3,4,5,6]
cs

이런식으로 리스트이름 = [] 대괄호 안에 숫자나 문자등을 넣어서 만들 수 있습니다.


1
2
3
list_name_num = [1,2,3,4,5,6]
list_name_string = ['h','i']
list_name_word = ['hello']
cs

이렇게 문자도 가능합니다.


1.2 List 인덱싱

1.2.1 인덱싱의 기초

앞서 말했듯 List는 파이썬의 시퀀스 자료형 이기 때문에 인덱스(쉽게말해 자리 번호표)를 가지고 있습니다.
그것을 가지고 연산을 할수 있는데 예제를 통해 알아보겠습니다.

 
1
2
a = [1,2,3]
print(a[0])
cs

결과는 어떻게 나올까요?

a라는 [리스트] 안에 0번째 인덱스를 프린트 했을때 무엇이 나올까요?

답은 1 입니다.


실험. 만약에 없는 인덱스를 프린트 했을경우 어떻게 될까?

a[3]은 없는 인덱스이기 때문에 당연히 index out of range라는 에러가 나오게 됩니다.


1.2.2 List 인덱싱의 연산

이요소들을 합치면 어떤 반응이 일어날까요?

1
2
a = [1,2,3]
print(a[0]+a[2])
cs

의 답은 무엇일까요?

a[0]은 1

a[2]는 3

즉 1+3이 되어 4가 나오게 될것입니다.


곱하기도 될까요?

1
2
a = [1,2,3]
print(a[0]*a[2])
cs

네 물론 됩니다.

a[0]은 1

a[2]는 3

즉 1*3이 되어 3가 나오게 될것입니다.


그럼 빼기도 되겠죠?

1
2
a = [1,2,3]
print(a[0]-a[2])
cs

네 물론 됩니다.

a[0]은 1

a[2]는 3

즉 1-3이 되어 -2가 나오게 될것입니다.



문자는 더하거나 곱하거나 빼면 어떻게 될까요?

1
2
a = ['h','e','ll','o']
print(a[0]+a[2])
cs
답: hll


그외 곱하기와 빼기는 문자열 이기 때문에 안된다는 에러메시지가 나옵니다.


1.3 리스트 슬라이싱

리스트의 슬라이싱은 매우 간단합니다.
리스트의 요소들이 있다면 그중 원하는 부분만 잘라내서 가져오는 것으로 생각하시면 되는데 실습을 통해서 알아보겠습니다.

기본 문법은 출력시에 name[:] 이며
[num:] num 이상(포함하고 부터)
[:num] num 미만(포함하지 않고 까지)
[num1:num2] num1이상 ~ num2미만
[::-1] 거꾸로
[1:10:2] 1이상 10미만중 2개씩만

예제를 통해 알아보겠습니다.

1
2
3
4
5
6
7
8
9
number = [1,2,3,4,5,6,7,8,9,10]
 
print(number[1:3])#이상~미만
print(number[3:])#이상
print(number[:3])#미만
print(number[1:3:2])#1이상 3미만 2개씩
print(number[0:9:2])#0이상 9미만 2개씩
print(number[::-1])#거꾸로
 
cs

주의하실점은 num:num일때 이상~미만입니다.

1:3일때 1번째를 포함하는애 부터 3번째는 포함하지 않습니다

이 점만 주의하시면 슬라이싱하시는데 문제 없으실겁니다.



1.4 리스트 연산

1.4.1 리스트 더하기

너무나도 간단하기 때문에 예제만 봐도 충분이 이해가 가실겁니다.

그냥 리스트끼리 합쳐져서 순서대로 출력됩니다.



1.4.2 리스트 반복

리스트의 기초는 너무 쉬워요~! 그냥 리스트*숫자를 사용하면 숫자만크 리스트를 반복시킵니다



1.4.3 리스트 수정


1.4.4 리스트 삭제

1.4.5 리스트 요소 추가

리스트의 요소를 추가하는 방법은 간단합니다.
리스트.append(요소) 를 사용하시면 되는데 주의하실점은 한번에 두개의 요소가 추가되지는 않지만
리스트안에 리스트를 추가할 수는 있다는 점입니다.

여러개의 리스트요소를 추가하고 싶을때 맨아래 extend를 참고하시면 됩니다.


1.4.6 리스트 정렬(sort)

문자와 숫자를 함께 정렬할수는 없는 것을 확인하실 수 있습니다.



1.4.7 리스트 뒤집기(reverse)

숫자와 문자가 함께있어도 잘 뒤집힙니다.



1.4.7 리스트 위치 반환(index)

a안에 있는 3의 요소 index를 확인하고 싶을때

a안에 있는 1의 요소 index를 확인하고 싶을때

없는 요소를 확인하면 list에는 요소가 없다고 에러가 납니다.



1.4.8 리스트 요소 삽입(insert)

3번째 index에 4를 넣겠다는 뜻입니다.

a = [ 1,  2,  3 ]

[0]  [1] [2] index 이기 때문에 3번째에 4가 추가되어 [1,2,3,4]가 됩니다.



1.4.9 리스트 요소 제거(remove)

여러개의 요소가 있다면 맨앞에 한개의 요소만 제거합니다.



1.4.10 리스트 요소 꺼내기(pop)

가장 뒤에 있는 요소가 삭제됩니다.



1.4.11 리스트 요소 갯수 세기(count)

요소의 갯수를 카운트합니다.



1.4.12 리스트 확장(extend)

list안에 요소를 추가하는데 추가개념이 아닌 확장 개념이기 때문에 결과값이 다음과 같이 나오게 된것입니다. 




저작자 표시 비영리 변경 금지
Continue Reading