TIL 11. 파이썬 - 시퀀스 자료형, 슬라이스, 딕셔너리

문승준·2021년 8월 25일
0

Python

목록 보기
3/8

1. 시퀀스 자료형

  • list, tuple, range, str 처럼 값이 연속적으로 이어진 자료형
  • tuple, range, str 은 읽기전용이다.

특정 값이 있는지 확인하기

  • in, not in
# 값이 있는지 in 으로 확인

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 30 in a
True


# 값이 없는지 not in 으로 확인

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> 30 not in a
False


# 리스트, 튜플, range, 문자열에서 확인

>>> 1 in range(10)
True
>>> 'P' in 'Hello, Python'
True

시퀀스 객체 연결하기

  • + 연산자 사용, range는 불가
  • 같은 자료형끼리만 연결 할 수 있다.
# 리스트끼리, 튜플끼리, 문자열끼리 연결

>>> a = [0, 10, 20, 30]
>>> b = [9, 8, 7, 6]
>>> a + b
[0, 10, 20, 30, 9, 8, 7, 6]

>>> 'Hello, ' + 'world!'
'Hello, world!'


# range는 연결불가 (리스트나 튜플로 만들어서 연결해야함)

>>> list(range(0, 10)) + list(range(10, 20))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]


# 문자열과 숫자 연결하기

>>> 'Hello, ' + str(10)      # str을 사용하여 정수를 문자열로 변환
'Hello, 10'
>>> 'Hello, ' + str(1.5)     # str을 사용하여 실수를 문자열로 변환
'Hello, 1.5'

시퀀스 객체 반복하기

  • * 연산자와 정수만 사용, range는 불가
# 정수를 곱해서 반복하기

>>> [0, 10, 20, 30] * 3
[0, 10, 20, 30, 0, 10, 20, 30, 0, 10, 20, 30]

>>> 'Hello, ' * 3
'Hello, Hello, Hello, '


# range는 연결불가 (리스트나 튜플로 만들어서 연결)

>>> list(range(0, 5, 2)) * 3
[0, 2, 4, 0, 2, 4, 0, 2, 4]
>>> tuple(range(0, 5, 2)) * 3
(0, 2, 4, 0, 2, 4, 0, 2, 4)

시퀀스 요소의 길이 구하기

  • 요소가 몇개인지 알 수 있다.
  • len() 함수 사용
# 리스트와 튜플

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> len(a)
10

>>> b = (38, 76, 43, 62, 19)
>>> len(b)
5


# range의 생성 개수 구하기

>>> len(range(0, 10, 2))
5


# 문자의 개수 구하기 (파이썬3)

>>> hello = 'Hello, world!'
>>> len(hello)
13

인덱스 사용하기

  • 시퀀스객체[인덱스]

  • 시퀀스객체.__getitem__() 메서드와 같다.

# 리스트, 튜플, 문자열, range

>>> r = range(0, 10, 2)
>>> r[2]        # range의 세 번째(인덱스 2) 요소 출력
2

>>> a = [38, 21, 53, 62, 19]
>>> a.__getitem__(1)
21


# 음수 인덱스

>>> b = (38, 21, 53, 62, 19)
>>> b[-1]        # 튜플의 뒤에서 첫 번째(인덱스 -1) 요소 출력
19


# 범위를 벗어난 인덱스

IndexError


# 마지막 요소에 접근하기 (len 함수 활용)

>>> a = [38, 21, 53, 62, 19]
>>> a[len(a) - 1]    # 마지막 요소(인덱스 4) 출력
19

인덱스로 요소 할당, 삭제하기

  • 요소의 변경과 수정은 list만 가능하다
# list의 요소 할당하기

>>> a = [1, 2, 3]
>>> a[0] = 3
>>> a
[3, 2, 3]


# list의 요소 삭제하기

>>> a = [1, 2, 3]
>>> del a[0]
>>> a
[2, 3]


# 범위를 벗어난 인덱스는 불가하다.

IndexError


# tuple, range, str은 불가하다.

TypeError


2. 슬라이스 (slice)


인덱스로 리스트, 튜플, 문자열 잘라내기

  • 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]
  • 음수 증가폭을 사용해 시퀀스 객체를 뒤집을 수 있다!
    -> 요소를 뒤에서부터 가져올 수 있다.
# 시퀀스객체[시작인덱스:끝인덱스]
# 끝인덱스-1 까지 가져온다.

>>> a = [0, 10, 20, 30, 40]
>>> a[1:4]     # 인덱스 0부터 3까지 잘라서 새 리스트를 만듦
[10, 20, 30]


# 인덱스 건너뛰며 가져오기
# 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:9:3]    # 인덱스 2부터 3씩 증가시키면서 인덱스 8까지 가져옴
[20, 50, 80]


# 인덱스를 생략해서 처음과 끝 지정하기
# 시퀀스객체[:끝인덱스] or 시퀀스객체[시작인덱스:]

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[:7]    # 리스트 처음부터 인덱스 6까지 가져옴
[0, 10, 20, 30, 40, 50, 60]


# 인덱스 생략하고 증가폭 지정하기

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[::2]     # 리스트 전체에서 인덱스 0부터 2씩 증가시키면서 요소를 가져옴
[0, 20, 40, 60, 80]


# 시퀀스 객체를 뒤집기 ( 음수 증가폭 사용 )

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[::-1]
[90, 80, 70, 60, 50, 40, 30, 20, 10, 0]


# 요소를 뒤에서부터 가져오기 ( 음수 증가폭 사용 ) 

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[5:1:-1]
[50, 40, 30, 20]


# len 사용해 전체를 가져오기

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[:len(a)]     # 시작 인덱스 생략, 끝 인덱스에 len(a) 지정하여 리스트 전체를 가져옴
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]


# 튜플도 사용 방법 동일

# 문자열도 사용 방법 동일


인덱스로 range 잘라내기

  • range에 사용하면 또다른 range 객체를 만든다.
  • 출력시 요소 전체가 아니라 생성 범위만 표시된다.
>>> r = range(10)

>>> r
range(0, 10)

>>> r[4:7]     # 인덱스 4부터 6까지 숫자 3개를 생성하는 range 객체를 만듦
range(4, 7)

>>> r[4:]      # 인덱스 4부터 9까지 숫자 6개를 생성하는 range 객체를 만듦
range(4, 10)

>>> r[:7:2]    # 인덱스 0부터 2씩 증가시키면서 인덱스 6까지 숫자 4개를 생성하는 range 객체를 만듦

range(0, 7, 2)

slice 객체로 시퀀스 객체 잘라내기

슬라이스객체 = slice(끝인덱스)

슬라이스객체 = slice(시작인덱스, 끝인덱스)

슬라이스객체 = slice(시작인덱스, 끝인덱스, 인덱스증가폭)

시퀀스객체[슬라이스객체]

시퀀스객체.__getitem__(슬라이스객체)

# slice 객체를 넣어 잘라내기

>>> range(10)[slice(4, 7, 2)]
range(4, 7, 2)
>>> range(10).__getitem__(slice(4, 7, 2))
range(4, 7, 2)


# 하나의 slice 객체를 만들어 여러 시퀀스 객체에 사용하기

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

>>> s = slice(4, 7)    # 인덱스 4부터 6까지 자르는 slice 객체 s 생성
>>> a[s]
[40, 50, 60]

>>> r = range(10)
>>> r[s]
range(4, 7)

>>> hello = 'Hello, world!'
>>> hello[s]
'o, '

슬라이스로 요소 할당, 삭제하기

  • 요소의 수정과 삭제는 list만 가능하다.
# 슬라이스 범위와 할당 값의 개수가 같을 때

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:5] = ['a', 'b', 'c']    # 인덱스 2부터 4까지 값 할당
>>> a
[0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]


# 슬라이스 범위와 할당 값의 개수가 다를 때 (줄어들거나 늘어난다)

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:5] = ['a']    # 인덱스 2부터 4까지에 값 1개를 할당하여 요소의 개수가 줄어듦
>>> a
[0, 10, 'a', 50, 60, 70, 80, 90]


# 인덱스 증가폭 지정 했을 때 -> 요소 개수가 일치해야 한다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:8:2] = ['a', 'b', 'c']    # 인덱스 2부터 2씩 증가시키면서 인덱스 7까지 값 할당
>>> a
[0, 10, 'a', 30, 'b', 50, 'c', 70, 80, 90]


# 건너뛰면서 삭제하기

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> del a[2:8:2]    # 인덱스 2부터 2씩 증가시키면서 인덱스 6까지 삭제
>>> a
[0, 10, 30, 50, 70, 80, 90]

EX) 여러 입력값에서 마지막 5개 요소만 가져오기

x = input().split()         # 입력값을 요소로 하는 리스트 만들어서

# 입력 1 2 3 4 5 6 7 8 9 10

del x[len(x)-1:len(x)-6:-1] # 음수 증가폭으로 뒤부터 요소를 선택

print(x)

# 결과 ['1', '2', '3', '4', '5']

EX) 두 개의 문자열에서 홀수 인덱스와 짝수 인덱스를 합쳐서 출력하기

x = input()
y = input()

# 입력 python -> 홀수 인덱스 가져오기
# 입력 python -> 짝수 인덱스 가져오기

print(x[1::2]+y[0::2])

# yhnpto


3. 딕셔너리

  • 해시(Hash)기법을 이용해 데이터를 저장한다.
  • 키-값 형태의 자료형을 해시, 해시 맵, 해시테이블 등으로 부르기도 한다.
  • 키-값 쌍 (key-value pair) 1:1 대응

딕셔너리 만들기

  • 딕셔너리 = { 키1 : 값1, 키2 : 값2 }
  • 중복된 키는 저장되지 않고 가장 뒤에 있는 값만 저장한다.
  • 키는 문자열, 정수, 실수, 불 타입을 사용할 수 있다.
  • 값에는 모든 자료형을 사용 할 수 있다.
# 다양한 자료형으로 만든 키 (정수, 실수, 불)

>>> x = {100: 'hundred', False: 0, 3.5: [3.5, 3.5]}
>>> x
{100: 'hundred', False: 0, 3.5: [3.5, 3.5]}


# 빈 딕셔너리 만들기

>>> x = {}
>>> x
{}

>>> y = dict()
>>> y
{}

dict로 딕셔너리 만들기

딕셔너리 = dict( 키1 = 값1, 키2 = 값2 )

딕셔너리 = dict( zip ([키1, 키2], [값1, 값2]) )

딕셔너리 = dict( [ (키1, 값1), (키2, 값2) ] )

딕셔너리 = dict( {키1: 값1, 키2: 값2} )

# 키 = 값 형식으로 만들기 (키에 따옴표 붙이지 않는다.)

>>> lux1 = dict(health=490, mana=334, melee=550, armor=18.72)
>>> lux1
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


# zip 함수로 키 리스트와 값 리스트를 묶기

>>> lux2 = dict(zip(['health', 'mana', 'melee', 'armor'], [490, 334, 550, 18.72]))
>>> lux2                                       
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


# 리스트 안에 (키, 값) 형식의 튜플 나열하기

>>> lux3 = dict([('health', 490), ('mana', 334), ('melee', 550), ('armor', 18.72)])
>>> lux3                                                
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}


# dict 안에서 중괄호로 만들기

>>> lux4 = dict({'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72})    
>>> lux4                                                         
{'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}

딕셔너리 키에 접근하고 값 할당하기

  • 딕셔너리[키]
# 키를 통해 값에 접근하기

>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> lux['health']
490
 

# 키를 통해 값을 할당하기

>>> lux = {'health': 490, 'mana': 1184, 'melee': 550, 'armor': 18.72}
>>> lux['health'] = 2037    # 키 'health'의 값을 2037로 변경
>>> lux
{'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72}


# 키를 추가하고 값을 할당하기

>>> lux = {'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72}
>>> lux['mana_regen'] = 3.28    # 키 'mana_regen'을 추가하고 값 3.28 할당
>>> lux
{'health': 2037, 'mana': 1184, 'melee': 550, 'armor': 18.72, 'mana_regen': 3.28}


# 없는 키를 가져오려하면 에러

키가 있는지 확인하기

  • in, not in
# in 으로 키가 있는지 확인하기

>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> 'health' in lux
True


# not in 으로 키가 없는지 확인하기

>>> 'health' not in lux
False

키 개수 구하기

  • 키의 개수는 값의 개수와 같다.

  • len()함수 사용

# 키의 개수가 곧 값의 개수이다.

>>> lux = {'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72}
>>> len(lux)
4
>>> len({'health': 490, 'mana': 334, 'melee': 550, 'armor': 18.72})
4

EX) 여러 문자열과 실수를 입력 받아서, 그것을 키와 값으로 하는 딕셔너리 만들기

x = input().split()             # 문자열 요소 리스트로 만들기
y = map(float, input().split()) # 요소를 실수로 바꾼 리스트로 만들기

# 입력 health health_regen mana mana_regen
# 입력 575.6 1.7 338.8 1.63

z = dict(zip(x,y))              # zip 함수 안에 키와 값 리스트 넣기

print(z)

{'health': 575.6, 'health_regen': 1.7, 'mana': 338.8, 'mana_regen': 1.63}

profile
개발자가 될 팔자

0개의 댓글