-
TIL.42_2 리스트, 튜플, 세트, 딕셔너리TIL 2020. 11. 20. 19:57728x90
다차원 리스트에서 인덱스 접근하는 방법
any_list = [ [1,2,3], [4,5,6], [7,8,9], [[10,11,12], 13, 14] ]; any_list[3]; # equals [[10,11,12], 13, 14] any_list[3][0]; # equals [10,11,12] any_list[3][0][1]; # equals 11
range로 리스트 값 넣기
변수 = [*range(값)]
range(값) 을 한번 언패킹해주면 된다.
my_list = [*(range(5))] print(my_list) # [0, 1, 2, 3, 4] my_list_2 = [range(5)] # [range(0, 5)]
리스트 연결하기
1. append
2. +
추가하려는 리스트가 1개 이상일 때 append 대신 "+" 를 쓸 수 있다.
color_list = color_list + ["Light Blue", "Pink"]'
list1 = [1, 2, 3, 4] list2 = [5, 6, 7] list1 + list2 print(list1) > [1, 2, 3, 4] list1 = list1 + list2 print(list1) > [1, 2, 3, 4, 5, 6, 7]
리스트 요소 순서 바꾸기
이전 학습하였던 내용으로 다시 한번 정리하고 넘어가도록 하자.
하나의 리스트로 합친, 리스트의 첫 element와 마지막 element를 서로 바꿔준 후 리스트 전체를 출력해보자
list1[0], list1[-1] = list1[-1], list1[0]
리스트의 첫번째 요소와 마지막 요소를 각각 변수로 할당하여 바꿔주었지만
위 방법으로 간편히 바꿀수 있는점을 기억하자.
def merge_and_swap(list1, list2): list1 = list1 + list2 if len(list1) == 0: return [] elif len(list1) == 1: return list1 else: ## list1[0], list1[-1] = list1[-1], list1[0] ## return list1 # 이 함수를 구현해 주세요 a = merge_and_swap([1,2,3], [5]) print(a)
리스트 슬라이싱
슬라이싱으로 원하는 만큼의 리스트를 가져올 수 있는데
여기서 슬라이싱을 이용한다는건 원래의 list를 변경하는것이 아닌
원래 List에서 슬라이싱 한만큼의 리스트를 새로 생성하는 것이다.
bts = ["RM", "제이홉", "진", "정국", "지민", "뷔", "슈가"] sub_bts = bts[1:4] print(f"bts = {bts}") > bts = ['RM', '제이홉', '진', '정국', '지민', '뷔', '슈가'] print(f"sub_bts = {sub_bts}") > sub_bts = ['제이홉', '진', '정국']
리스트 요소 삭제하기
아래에서 보듯 대부분 리스트에서 삭제하는 메서드는 원본 리스트를 건드리게 된다.
del, remove
list = [ "나연", "사나", "정연", "모모", "미나", "채영", "다현", "쯔위", "지효"] del list[3] # 원본 리스트 자체가 변경됨 print(list) list.remove("미나") # 원본 리스트 자체가 변경됨 print(list)
pop로 요소를 삭제할 경우 위의 메서드와는 달리 값을 할당하는 용도로 사용 할 수 있다.
a = [1, 2, 3, 4, 5] b = a.remove(3) print(b) # None c = a.pop() print(c) # 5
아래의 예제를 통해 삭제할때 인덱스 순서도 중요하다는것을 알아보자.
리스트에서 홀수를 지우고 짝수만 남은 리스트를 리턴해주는 문제이다.
아직은 반복문의 개념이 아니기에 조건을 많이 걸어주어 하나하나 비교한다
여기서 리스트 요소 삭제시 뒤에서 부터 지워야한다.
[1, 2, 3, 4, 5] 에서 1을 먼저 지우게 될 경우 [2, 3, 4, 5]로 2를 검증해야하는데 3을 검증하고 나아가서는 리스트의 요소 갯수가 줄어들어
out of index error 가 발생한다.
def remove_odd_numbers(numbers): if numbers[0] % 2 != 0: del numbers[0] if numbers[1] % 2 != 0: del numbers[1] if numbers[2] % 2 != 0: del numbers[2] if numbers[3] % 2 != 0: del numbers[3] if numbers[4] % 2 != 0: del numbers[4] return numbers print(remove_odd_numbers([1,2,3,4,5])) ## error out of index
따라서 뒤에서부터 요소를 지워줘야한다.
def remove_odd_numbers(numbers): if numbers[4] % 2 != 0: del numbers[4] if numbers[3] % 2 != 0: del numbers[3] if numbers[2] % 2 != 0: del numbers[2] if numbers[1] % 2 != 0: del numbers[1] if numbers[0] % 2 != 0: del numbers[0] return numbers print(remove_odd_numbers([1,2,3,4,5]))
튜플
튜플은 리스트와 유사한 특성을 가지고 있지만 immutable로서 안에 값을 수정할 수 없다.
하지만 아래와 같이 수정이 필요없고 간단한 형태의 데이터를 표현할때는 튜플을 사용하는게 훨씬 효과적이다.
이유는 리스트는 수정이 가능하고 여러가 수의 요소들을 저장할 수 있으며, 튜플보다 더 많은 기능과 flexibility를 제공하기 때문에
어쩔수 없이 튜플보다 사용하는 메모리 용량이 더 많을 수 밖에 없다.
따라서 수정이 필요없고 간단한 형태의 데이터를 표현할때는 튜플이 훨씬 효과적이다.
set
- set는 list와 비슷하지만 중복된 값을 저장하지 않는다.
- 요소들을 순서대로 저장하지 않는다. (unordering)
순서가 없으므로 indexing도 없으며, 몇번째 요소를 읽거나 할 수 없다.
따라서 for문 응용시 요소들이 무작위 순서대로 나온다. (오름차순 정렬이 되어있는 숫자로만 이루어진 set는 순서대로 나오긴 한다)
b = set(range(5)) c = set(range(5)) d = {"문", "타", "리", "최", "고"} print(b) print(c) print(d) # {0, 1, 2, 3, 4} {0, 1, 2, 3, 4} {'리', '문', '고', '최', '타'} # 매번 순서 바뀜
set 생성하는 법
중괄호 혹은 set{}를 사용한다
b = {1, 2, 3,} c = set({1, 2, 3}) # {1, 2, 3}
리스트 요소를 세트로 변환하기 다양한 방법이 있지만 리스트를 직접 넣어 set로 변환시켜보자
a = [1, 2, 1, 1, 3, 4, 5] a = set(a) b = set([1, 2, 1, 1, 3, 4, 5]) # {1, 2, 3, 4, 5}
set 요소 추가하기
set는 요소의 순서가 없기에 리스트에서 사용했던 append 가아닌 add를 통해 추가시켜 줄 수 있다.
my_set = {1, 2, 3} my_set.add(15) print(my_set) # {1, 2, 3, 15}
set 요소 삭제하기
remove를 사용한다.
my_set = {1, 2, 3} my_set.remove(3) print(my_set) # {1, 2}
set Look up
Set에 어떠한 값이 이미 포함되어 있는지를 알아보는 것을 look up 이라 부르며
Set에서 look up을 하기 위해서는 in 키워드를 사용해야 합니다.
in - 들어있으면 True
not in - 들어있으면 False 반환
a = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'} print('orange' in a) # True print( 'apple' in a) #False print('orange' not in a) #False print('apple' not in a) # True
set 집합 연산자 사용하기
TIL.20 참고
codermun-log.tistory.com/38?category=895182
Dictionary
파이썬의 다양한 자료구조(date structure) 중 리스트나 튜플로 정보의 연관성에 기반하여 값을 저장하고자 할때
리스트나 튜플의 자료구조로는 다룰 수 없는 정보가 있다
아래의 예로 멤버 이름과 각 멤버의 실명을 함께 저장하고 싶을때 Dictionay 자료구조를 이용하면 쉽게 저장할 수 있다.
bts = ["RM", "제이홉", "진", "정국", "지민", "뷔", "슈가" ] bts = {"RM" : "김남준", "제이홉" : "정호석", "진" : "김석진", "정국" : "전정국", "지민" : "박지민", "뷔" : "김태형", "슈가" : "민윤기"}
Dictionary key (키)
딕셔너리에서 "키" 는 str 뿐아닌 숫자도 가능하다
"키"값은 중복될 수 없다.
이미 있는 "키" 값으로 요소를 추가하게 되면 이전에 저장되어있던 "키의 값"이 치환된다.
dict1 = { 1 : "one", 1 : "two" } print(dict1) # { 1: "two" }
Dictionary 요소 읽기
리스트와 유사하지만, 차이점으로는 인덱스가 아닌 "키" 로 접근한다는 것이다.
키로 요소에 접근하여 "값"을 얻을 수 있다.
bts = {"RM" : "김남준", "제이홉" : "정호석", "진" : "김석진", "정국" : "전정국", "지민" : "박지민", "뷔" : "김태형", "슈가" : "민윤기"} print(bts["진"]) # 김석진
Dictionary 요소 추가하기
리스트의 요소 추가와 비슷하나 "키" 를 사용한다는 점에서 차이가 있다.
dict[키] = 값
my_dict = { "one": 1, 2: "two", 3 : "three" } my_dict["four"] = 4 print(my_dict) # {'one': 1, 2: 'two', 3: 'three', 'four': 4}
빈 딕셔너리를 만들어 추가도 가능하며, 아래와 같이 만들경우 Set가 아닌 dict로 만들어진다는 것을 기억하자
my_dict = { } # dictionay , not set print(type(my_dict)) # <class 'dict'>
Dictionary 요소 추가하기
리스트의 요소 삭제 또한, 비슷하나 "키" 를 사용한다는 점에서 차이가 있다.
del my_dict[키] -> 해당 키 : 값 쌍을 삭제
my_dict = { "one": 1, 2: "two", 3 : "three" } del my_dict["one"] print(my_dict) # {2: 'two', 3: 'three'}
Dictionary Grouping
딕셔너리를 이해하기 위해 여지껏 적은양의 데이터에 접근하는 방식으로 학습하였지만
만약 아래와 같이 BTS 7명 전원의 데이터 정보를 다루기 위해선 어떻게 접근하면 좋을까
아래와 같이 리스트를 이용해 딕셔너리를 구성하면 손쉽게 Dictionary Grouping을 할 수 있다.
딕셔너리 그룹을 사용하여 for 문에 적용할때 수월한 로직을 구현 할 수 있다.
bts = [ { "실명" : "김남준", "가명" : "RM", "생년월일" : "1994년 9월 12일", "출생지" : "대한민국 서울특별시 동작구 상도동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리더 · 메인 래퍼" }, { "실명" : "김석진", "가명" : "진", "생년월일" : "1992년 12월 4일", "출생지" : "대한민국 경기도 과천시", "학력" : "한양사이버대학교 대학원", "포지션" : "서브 보컬" }, { "실명" : "민윤기", "가명" : "슈가", "생년월일" : "1993년 3월 9일", "출생지" : "대한민국 대구광역시 북구 태전동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리드 래퍼" }, { "실명" : "정호석", "가명" : "제이홉", "생년월일" : "1994년 2월 18일", "출생지" : "대한민국 광주광역시 북구 일곡동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "서브 래퍼 · 메인 댄서" }, { "실명" : "박지민", "가명" : "지민", "생년월일" : "1995년 10월 13일", "출생지" : "대한민국 부산광역시 금정구 금사동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리드 보컬 · 메인 댄서" }, { "실명" : "김태형", "가명" : "뷔", "생년월일" : "1995년 12월 30일", "출생지" : "대한민국 대구광역시 서구 비산동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "서브 보컬" }, { "실명" : "전정국", "가명" : "정국", "생년월일" : "1997년 9월 1일", "출생지" : "대한민국 부산광역시 북구 만덕동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "메인 보컬 · 서브 래퍼 · 리드 댄서" } ] print(type(bts)) # <class 'list'>
Nested Dictionary (중첩 딕셔너리)
하지만 실제로 데이터가 이렇게 작지 않기 때문에 원하는 값을 뽑기 위한 목적으로 딕셔너리 그룹으로 접근할 경우 실행 시간이 길어진다.
따라서, 원하는 정보를 한번에 찾을 수 있도록 방대한 양의 데이터를 중첩 딕셔너리 구조로 저장하여 원하는 요소에 쉽게 접근 할 수 있다.
딕셔너리 = {키1: {키A: 값A}, 키2: {키B: 값B}}
참고 TIL.18 codermun-log.tistory.com/32
bts = { "RM": { "실명" : "김남준", "가명" : "RM", "생년월일" : "1994년 9월 12일", "출생지" : "대한민국 서울특별시 동작구 상도동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리더 · 메인 래퍼" }, "진": { "실명" : "김석진", "가명" : "진", "생년월일" : "1992년 12월 4일", "출생지" : "대한민국 경기도 과천시", "학력" : "한양사이버대학교 대학원", "포지션" : "서브 보컬" }, "슈가": { "실명" : "민윤기", "가명" : "슈가", "생년월일" : "1993년 3월 9일", "출생지" : "대한민국 대구광역시 북구 태전동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리드 래퍼" }, "제이홉": { "실명" : "정호석", "가명" : "제이홉", "생년월일" : "1994년 2월 18일", "출생지" : "대한민국 광주광역시 북구 일곡동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "서브 래퍼 · 메인 댄서" }, "지민": { "실명" : "박지민", "가명" : "지민", "생년월일" : "1995년 10월 13일", "출생지" : "대한민국 부산광역시 금정구 금사동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "리드 보컬 · 메인 댄서" }, "뷔": { "실명" : "김태형", "가명" : "뷔", "생년월일" : "1995년 12월 30일", "출생지" : "대한민국 대구광역시 서구 비산동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "서브 보컬" }, "정국": { "실명" : "전정국", "가명" : "정국", "생년월일" : "1997년 9월 1일", "출생지" : "대한민국 부산광역시 북구 만덕동", "학력" : "글로벌사이버대학교 방송연예학과", "포지션" : "메인 보컬 · 서브 래퍼 · 리드 댄서" } } print(bts["제이홉"]["생년월일"]) # 키1 = "제이홉", 키A = "생년월일"로 이해가능 # 1994년 2월 18일
728x90'TIL' 카테고리의 다른 글
TIL.43_2 Closure, Decorator, Scope (클로저, 데코레이터,스코프) (0) 2020.11.21 TIL.43 반복문 (for, while) (0) 2020.11.21 TIL.42 개발자 도구 DevTools (wecode_5일차) (0) 2020.11.20 TIL.41_2 function parameters(위치, 키워드인수) (0) 2020.11.19 TIL.41 python Repl.it_1(wecode_4일차) (0) 2020.11.19