콘텐츠로 이동

군집 자료형 1 - 문자열과 리스트

1. 문자열

문자열 안에 ' 또는 "를 넣고 싶을 때

'안녕' 또는 "안녕"            print('안녕') 또는 print("안녕") 
'Hello' 또는 "Hello"  ->    print('Hello') 또는 print("Hello")
'1988' 또는 "1988"          print('1988') 또는 print("1988")


“88 서울 올림픽 마스코트는 ‘호돌이' 이다."
'그는 이렇게 말했다. "나는 파이썬을 사랑해!" 라고 '
print("88 서울 올림픽 마스코트는 '호돌이' 이다.") 
print('그는 이렇게 말했다. "나는 파이썬을 사랑해!" 라고 ')


'88 서울 올림픽 마스코트는 '호돌이' 이다.'
"그는 이렇게 말했다. "나는 파이썬을 사랑해!" 라고 "

SyntaxError 발생

SyntaxError: invalid syntax

문제 해결 방법 : Escape Character 를 사용

이스케이프문자 기능
\" 화면에 큰 따옴표를 표시
\' 화면에 작은 따옴표를 표시
\n 줄 바꿈
\t 탭(tab)만큼 띄우기
\ \ 화면에 역슬래시(\)를 표시
#section_019.py

text1 = '문자열은 작은 따옴표 또는 큰 따옴표로 묶을 수 있다.'
print(type(text1))

text2 = '작은 따옴표로 묶인 문자열 안에 큰 따옴표 (")는 문제 없네요.'
print(text2)

text3 = "큰 따옴표로 묶인 문자열 안에 작은 따옴표 (')는 문제 없네요."
print(text3)

text4 = '특수문자열은 \' 이렇게  \' 출력되요. '

Output

<class 'str'>
작은 따옴표로 묶인 문자열 안에 큰 따옴표 (")는 문제 없네요.
큰 따옴표로 묶인 문자열 안에 작은 따옴표 (')는 문제 없네요.
특수문자열은 '이렇게' 출력되요.

여러 줄 문자열 처리

  • 파이썬에서는 여러 줄 문자열을 만들 수 있다.
  • 여러줄 문자열을 표현할때는 작은 따옴표 또는 큰 따옴표 3개를 연달아 사용해서 여러 줄 문자열을 묶어 준다.
  • 여러줄 문자열을 사용하면 줄바꿈, 탭, 공백등이 그대로 표현된다.
text = '나는 문자열이다. \n 줄바꿈하려면 특수문자열을 써야하고, \\n 특수문자열을 사용하면  \t탭도 가능하다.'

print(text)
print()

multiText = '''
그런대 여러 줄 문자열을 사용하면
여기 보이는 그대로 출력된다.
줄바꿈이라 탭이나 공백도 그대로이다.
    큰따옴표 세개 (""")를 사용해도
    같은 결과를 얻을 수 있다.
    물론 다양한 특수문자 ~!@#$%^&*()도 그대로 출력된다.
'''
print(multiText)

Output

나는 문자열일다.
줄바꿈하려면 특수문자열을 써야하고,
특수문자열을 사용하면 탭도 가능하다.


그런데 여러 줄 문자열을 사용하면
여기 보이는 그대로 출력된다.
줄바꿈이라 탭이나 공백도 그대로이다.
큰따옴표 세개 (""")를 사용해도
같은 결과를 얻을 수 있다.
물론 다양한 특수문자 ~!@#$%^&*()도 그대로 출력된다.

문자열 연산

  • 문자열 연산은 문자열에 대해서 적용할 수 있는 연산으로 다음 두 가지가 있다.
    • 문자열 * 숫자: 문자열을숫자만큼반복
      "=" * 40
      
    • 문자열 + 문자열: 두문자열을연결
      "Python은" + "훌륭한 프로그래밍 언어이다"
      
  • 문자열 연산은 문자열 변수에 대해서도 연산 적용이 가능하다.
#section_21.py

print("=" * 40)

print("Python은" + " 훌륭한 프로그래밍 언어이다")

head = "Python은 "
tail = "훌륭한 프로그래밍 언어이다"
string = head + tail
print(string)

str1 = "꿈"
str2 = "과"
str3 = "도"
str4 = "전"

print(str1 + str2 + " " + str3 + str4)

print ("=" * 40)

Output

========================================
Python은 훌륭한 프로그래밍 언어이다
Python은 훌륭한 프로그래밍 언어이다
꿈과 도전
========================================

문자열 인덱싱

  • 문자열 인덱스(index)는 문자열에 지정되어 있는 번호를 말하며, 정방향으로는 0부터 시작하고 역방향으로는 -1부터 시작한다.
  • 인덱싱은 인덱스(index)를 이용해서 지정된 위치의 값을 가져오는 기능을 말한다.
                -------------------------
                | N | A | T | U | R | E |
                ------------------------- 
                  ↑   ↑   ↑   ↑   ↑   ↑ 
정방향 인덱스 번호 →  0   1   2   3   4   5
                 -6  -5  -4  -4  -2  -1  ← 역방향 인덱스 번호
  • 순서를 가지고 있어서 위치 번호(index)를 이용해 인덱싱이 가능한 객체를 시퀀스형 객체라고 한다.
  • 시퀀스형 객체로는 문자열과 더불어 앞으로 배울 리스트(list), 튜플(tuple), range 등이 있다.
#section_022.py

string = "NATURE"

print(string[0])
print(string[1])
print(string[5])

print(string[-1])
print(string[-2])
print(string[-6])

Output

N
A
E
E
R
N

2. 문자열

문자열 슬라이싱

슬라이싱(slicing)

  • 문자열, 리스트, 튜플 같은 시퀀스 객체가 포함하고 있는 값들 가운데 일부를 추출할 때 사용하는 기능
  • 슬라이싱지정방법: 변수[시작 위치 : 끝 위치]
  • 슬라이싱의 위치 지정에서는 정방향 인덱스 번호나 역방향 인덱스 번호가 사용될 수 있다.

주의

정방향 인덱스 번호가 사용되든 역방향 인덱스 번호가 사용되든 값이 추출되려면 시작 위치가 끝 위치 보다 앞을 가리켜야 한다

  • 추출되는 값은 시작 위치의 값부터 끝 위치 바로 전까지의 값이 된다.

주의

슬라이싱 끝 위치 지정 시, 끝 위치의 값은 포함되지 않는다

  • 시작 위치를 생략하면 맨 처음부터 시작하는 것으로 지정된다.
  • 끝 위치를 생략하면 맨 마지막 값까지 포함되는 것으로 지정된다.
#section_023.py
string = "NATURE"
print("-" * 5 + "정방향" + "-" * 5)
print(string[0:5])
print(string[2:4])
print(string[2:])
print(string[:3])

print("-" * 5 + "역방향" + "-" * 5)
print(string[-4:-2])
print(string[-6:])
print(string[:-3])

Output

-----정방향-----
NATUR
TU
TURE
NAT
-----역방향-----
TU
NATURE
NAT

문자열은 불변이다.

  • 문자열을 구성하는 문자들은 다른 것으로 변경할 수 없다.
  • 문자열 관련 메서드를 이용하면 메서드 수행결과로 새로운 문자열이 생성되는 것이지 원본 문자열이 바뀌는 것이 아니다.
  • 정의 내려진 문자열의 항목을 강제로 바꾸려고 할 경우 에러가 발생한다
#section_024.py

string = "name"
print(string)

capital = string.upper()

print(capital)
print(string)

#string(0) = "N" # 오류 발생

Output

name
NAME
name

문자열 관련 메서드

  • 문자열 관련 메서드
메서드 설명
upper() 문자열 내의 소문자를 모두 대문자로 변환
lower() 문자열 내의 대문자를 모두 소문자로 변환
count() 문자열 내 count()메서드의 괄호 안에 지정한 문자가 몇 개 있는 지 count
startswith() 문자열이 startswith()메서드의 괄호 안에 지정한 문자로 시작하면 True 값 반환
(주의! 대소문자 구분함)
endswith() 문자열이 endswith()메서드의 괄호 안에 지정한 문자로 끝나면 True 값 반환
(주의! 대소문자 구분함)
split() split() 메서드의 괄호 안에 지정한 문자를 기준으로 문자열을 분리해서 리스트로 만듦
(괄호 안을 비워서 사용하면 공백문자를 기본값으로 지정)
zfill() zfill() 메서드의 괄호 안에 지정한 숫자만큼 문자열 길이를 늘림
(늘린 결과는 기존 문자열이 우측 정렬되고 추가 생성된 왼쪽 공간에 숫자 0이 채워 진다)
#section_025.py   
myStr = "Hello my little baby"
print(myStr.upper())
print(myStr.lower())
print(myStr.title())
print()

print(myStr.count('b'))
print(myStr.endswith('y'))
print(myStr.startswith('h'))
print(myStr.lower().startswith('h'))
print()

mystrlist1 = myStr.split()
print(mystrlist1)
mystrlist2 = myStr.split(',')
print(mystrlist2)

myStrFill = myStr.zfill(30)
print(myStrFill)

Output

HELLO MY LITTLE BABY
hello my little baby
Hello My Little Baby

2
True
False
True

['Hello', 'my', 'little', 'baby']
['Hello my little baby']
0000000000Hello my little baby

3. 리스트(list)

리스트(list) 사용하기

리스트(list) 란?

  • 값의 나열이며, 순서가 존재한다.
  • 하나의 리스트 안에 여러 종류(자료형)의 값을 담을 수 있다.
  • 0부터 시작하는 정방향 인덱스, -1부터 시작하는 역방향 인덱스가 있으며, 슬라이싱도 가능하다.
  • 리스트는 대괄호([ ])를 사용하여 정의 내린다.
    [1, 2, 3, 4, 5]
    ['버스', '트럭', '승용차', '밴']
    [1000, '1달러', 2000, '2달러', 3000, '3달러']
    
  • 리스트를 할당받는 변수를 리스트 변수라고 한다.
    count = [1, 2, 3, 4, 5]
    
#section_026.py

count = [1, 2, 3, 4, 5]
cars = ['버스', '트럭', '승용차', '밴']
wondolar = [1000, '1달러', 2000, '2달러', 3000, '3달러']

print(count)
print(cars)
print(wondolar)

print(count[0])
print(cars[2])
print(wondolar[-1])

Output

[1, 2, 3, 4, 5]
['버스', '트럭', '승용차', '밴']
[1000, '1달러', 2000, '2달러', 3000, '3달러']
1
승용차
3달러

리스트 변경하기

  • 리스트의 각 항목은 필요에 따라 바꿀 수 있다.
  • 리스트의 항목을 바꾸고 싶을 때는 인덱스를 이용하여 접근하면 된다.
  • 리스트와 리스트를 연결할 때는 + 연산자를 사용하며, 이때 새로운 리스트가 생성된다.
#section_027.py

cheeses = ['체다', '모짜렐라', '까망베르', '리코타']
print(cheeses)

cheeses[0] = '크림'
print(cheeses)

all = cheeses + ['블루']
print(all)
print(cheeses)

Output

['체다', '모짜렐라', '까망베르', '리코타']
['크림', '모짜렐라', '까망베르', '리코타']
['크림', '모짜렐라', '까망베르', '리코타', '블루']
['크림', '모짜렐라', '까망베르', '리코타']

리스트 슬라이싱

  • 리스트도 문자열과 같이 슬라이싱으로 일부분만 추출할 수 있다.
  • 리스트 슬라이싱 방법은 문자열의 슬라이싱과 같다.
  • 슬라이싱하면 새로운 리스트가 생성되며, 이것을 계속 사용하려면 별도의 변수에 저장해야 한다.
#section_028.py

bucket = ['세계일주', '악기 하나 배우기', '누군가의 후원자 되기', '베스트셀러 작가']
print(bucket)

done = bucket[1:3]
print(done)

print(bucket[0:4])

Output

['세계일주', '악기 하나 배우기', '누군가의 후원자 되기', '베스트셀러 작가']
['악기 하나 배우기', '누군가의 후원자 되기']
['세계일주', '악기 하나 배우기', '누군가의 후원자 되기', '베스트셀러 작가']

리스트 관련 메서드 1

  • 리스트는 다양한 메서드를 가지고 있다.
  • 리스트에서 특정 항목의 위치를 가져오기 위해서는 index() 메서드를 사용한다.
  • 리스트에 항목을 추가하기 위한 메서드로는 append(), insert(), extend()가 있으며, 각 메서드의 차이를 알아 둘 필요가 있다.
메서드 설명 리턴값
list변수.index(obj) 리스트에서 obj 객체가 위치한 가장 첫 번째 인덱스를 반환한다. 인덱스 리턴,
리턴값이 없으면 오류 발생
list변수.append(obj) 리스트에 obj 객체 한 개를 추가한다. 리턴값이 없고
리스트만 갱신
list변수.insert(index, obj) 리스트의 index 위치에 obj객체를 삽입한다. 리턴값이 없고
리스트만 갱신
list변수.extend(list_obj) 리스트에 리스트를 추가한다. 리턴값이 없고
리스트만 갱신
#section_029.py

colors = ['red', 'orange', 'yellow']
print(colors)

print('red의 위치:', colors.index('red')) # 위치 가져오기
print('orange의 위치:', colors.index('orange')) 
print()

colors.append('purple') # 항목추가하기
print(colors)

colors.insert(3, 'green') # 항목추가하기
print(colors)

colors.extend(['black', 'white']) # 항목추가하기
print(colors)

Output

['red', 'orange', 'yellow']
red의 위치: 0
orange의 위치: 1

['red', 'orange', 'yellow', 'purple']
['red', 'orange', 'yellow', 'green', 'purple']
['red', 'orange', 'yellow', 'green', 'purple', 'black', 'white']

리스트 관련 메서드 2

  • 리스트의 항목들을 정렬하기 위한 메서드로는 sort()reverse()가 있다.
  • pop()메서드는 리스트의 맨 마지막에 있는 항목을 가져오게 되며, 이때 추출된 항목을 리스트에서 삭제된다. 반면, remove() 메서드는 지정한 obj 항목을 리스트에서 삭제하지만 가져오지는 않는다.
  • count() 메서드는 항목의 개수를 셀 때 사용한다.
메서드 설명 리턴값
list변수.sort() 리스트를 구성하는 항목들을 정렬한다. 리턴값은 없고 리스트 내부를 정렬
list변수.reverse() 리스트를 구성하는 항목들을 역순으로 정렬한다. 리턴값은 없고 리스트 내부를 역순으로 정렬
list변수.pop() 리스트의 맨 마지막 항목을 리턴하고 리스트에서 삭제한다. 삭제된 항목을 리턴
list변수.remove(obj) 리스트에서 obj 객체를 삭제한다. 리턴값이 없고 리스트만 갱신
list변수.count(obj) 리스트에서 obj 객체가 몇 개 있는지 알려준다. obj 객체의 수를 리턴
#section_030.py

colors = ['red', 'orange', 'yellow', 'green', 'yellow']
print(colors)

colors.sort() #항목 정렬하기
print(colors)

colors.reverse() #역순 정렬하기
print(colors)

colors.pop() #항목 가져오기
print(colors)

colors.remove('red') #항목삭제하기
print(colors)

print(colors.count('yellow')) #항목 개수 세기

Output

['red', 'orange', 'yellow', 'green', 'yellow']
['green', 'orange', 'red', 'yellow', 'yellow']
['yellow', 'yellow', 'red', 'orange', 'green']
['yellow', 'yellow', 'red', 'orange']
['yellow', 'yellow', 'orange']
2

리스트 관련 내장 함수

  • 리스트를 내장 함수와 함께 사용하면 코딩이 편리해 진다.
  • sorted() 함수는 원본 리스트를 변경하지 않고 정렬된 새로운 리스트를 만들어 반환한다.
  • list()함수는 다른 종류의 시퀀스형 객체를 리스트로 만들어 준다.
함수 설명 리턴값
len() 리스트에 들어있는 항목의 개수를 리턴한다. 항목의 개수
max() 리스트에 들어있는 항목 최대값을 리턴한다. 항목중 최대값
min() 리스트에 들어있는 항목 최소값을 리턴한다. 항목중 최소값
sum() 리스트에 들어있는 항목들의 합을 리턴한다. 항목들의 합
sorted() 리스트에 들어있는 항목들을 오름차순으로 정렬한다. 정렬된 새로운 리스트
list(seq) 괄호 안의 시퀀스형 객체 seq를 리스트로 만들어 준다. 리스트
#section_031.py
floating = [12.831, 4.89, 4037.0, 11.19]

print(len(floating))
print(max(floating))
print(min(floating))
print(sum(floating))
print()

print(sorted(floating))
print(floating)

string = "python"
print(list(string))

Output

4
4037.0
4.89
4065.911

[4.89, 11.19, 12.831, 4037.0]
[12.831, 4.89, 4037.0, 11.19]
['p', 'y', 't', 'h', 'o', 'n']