[python 기초] 자료형 정리 (dictionary 를 등한시했던 나를 반성하며...)

EMMA·2022년 3월 5일
0
post-thumbnail

공부하다 보니, dictionary에서 학습이 부족하다는 것을 알게 되었다.


처음 불길한 징조(?)의 시작은 wecode 1주차 python session 때였다.
my_dict에서 key만 출력하기, key&value 둘 다 출력하기 등을 학습하는데 아묻따 print(my_dict.item())/print(my_dict.key()) 등을 외치고 있는 나를 발견하고 (...)
아, dictionary 위주로 다시 정리해야겠다는 생각을 했다.


1️⃣ Dictionary
key:value 형태며,my_dict = {"새:"bird"} 이 기본적인 전체 형태다.
key값이 여러 개일 경우 my_dict = {"새:"bird","날다":"fly"} 와 같이 작성한다.

Dictionary의 가장 중요한 점은,

  • key:value와 같이 대응 관계의 자료를 갖는다 (associate array or hash라고 부름)
  • 자료의 순서가 없어 indexing/slicing은 불가능하다.
  • key값은 중복될 수 없다.
    • 그래서 key값에는 list형 요소를 넣을 수 없다
    • 숫자/문자 모두 올 수 있다
  • key를 통해 value를 호출한다.
number_dict = { "one": 1, 2: "two", 3 : "three" }
print(number_dict["one"])
> 1

요소 추가/삭제하는 방법은 아래와 같다.

#추가 
number_dict = { "one": 1, 2: "two", 3 : "three" }
number_dict["four"] = 4
print(number_dict)
> {'one': 1, 2: 'two', 3: 'three', 'four': 4}
#삭제
number_dict = { "one": 1, 2: "two", 3 : "three" }
del number_dict["three"]
print(number_dict)
> {'one': 1, 2: 'two'}

key값 유무는 아래와 같이 확인할 수 있다.

number_dict = { "one": 1, 2: "two", 3 : "three" }
print("one" in number_dict)
> True

key/value만 뽑을 수 있는데, keys(), values(), items()함수가 그 방법.

#key 리스트
number_dict = { "one": 1, 2: "two", 3 : "three" }
print(number_dict.keys())
> dict_keys(['one', 2, 3]) 

#value 리스트
number_dict = { "one": 1, 2: "two", 3 : "three" }
print(number_dict.values())
> dict_values([1, 'two', 'three'])

#key:value 리스트
number_dict = { "one": 1, 2: "two", 3 : "three" }
print(number_dict.items())
> dict_items([('one', 1), (2, 'two'), (3, 'three')])

dictionary는 당연히 중첩(nested) 형태도 가능하다.
아래와 같이 bts_members라는 중첩 형태의 딕셔너리를 만들었다고 가정해보자.
bts_members = {
  "지민":{
    "가명" : "지민",
    "본명" : "박지민",
    "생년월일" : "1995년 10월 13일",
    "출생지" : "부산",
    "포지션" : "메인댄서, 리드보컬",
    "학력" : "한양사이버대학교 대학원 졸업"
  }
}

여기서 "1995년 10월 13일"을 추출하고 싶다면,아래와 같이 작성하면 된다.

print(bts_members["지민"]["생년월일"])
> 19951013

2️⃣ Set
Dictionary와 마찬가지로 순서가 없는 집합 자료형이다 (indexing/slicing 사용 불가).
set자료형 만드는 방식은 set([1,2,3]) 과 같고, 출력하면 {1,2,3} 과 같이 나온다.
dictionary와 달리 key:value 형태는 아니다.

중복을 허용하지 않는다는 것이 가장 큰 특징이며, 여기서는 dictionary와 비슷하다고 할 수 있겠다. (dictionary 또한 key값의 중복을 허용하지 않음)

요소 추가/삭제는 아래와 같이 한다.

#추가
s1 = set([1, 2, 3])
s1.add(4)
print(s1)
> {1,2,3,4}
#여러 개 추가
s1 = set([1, 2, 3])
s1.update([4,5])
print(s1)
> {1,2,3,4,5}
#삭제 
s1 = set([1, 2, 3])
s1.remove(1)
> {2,3}

set은 중복을 허용하지 않는다는 점 때문에, 합집합/교집합/차집합 기능을 사용할 수 있다.

s1 = set([1, 2, 3, 4, 5, 6])
s2 = set([4, 5, 6, 7, 8, 9])

#교집합
print(s1 & s2)
print(s1.intersection(s2))
> {4,5,6}

#합집합
print(s1 | s2)
print(s1.union(s2))
> {1,2,3,4,5,6,7,8,9}

#차집합
print(s1 - s2)
print(s1.difference(s2))
> {1,2,3}

또한, list 자료형에서 중복 요소 제거용으로도 사용할 수 있다.

a = [1, 2, 3, 3, 5]
print(set(a))
> {1,2,3,5} 

3️⃣ List
list는 set과 달리 중복이 허용되며, 순서가 있다. 그래서 indexing/slicing이 가능하다.

a = [1, 2, ['a', 'b', ['Life', 'is']]]
print(a[0]) 
> 1
print(a[2][2][0])
> "Life"

내 체감상 파이썬에서 가장 많이 쓰이며, 사용 가능한 함수도 정말 많다.

bts = ["RM", "제이홉", "진",  "정국",  "지민",  "뷔",  "슈가" ]

print(len(bts))
> 7 

print(bts.count("슈가"))
> 1

bts.append("ARMY")
bts.extend(["ARMY"])
bts.insert(7,"ARMY")	#만약 중간에 넣는 경우, 뒤의 요소들은 index가 하나씩 밀림
print(bts)
> ['RM', '제이홉', '진', '정국', '지민', '뷔', '슈가', 'ARMY']

del bts[7]
print(bts)
> ['RM', '제이홉', '진', '정국', '지민', '뷔', '슈가']

그 외 정렬에 관련한 함수는 아래와 같다.

alphabet = ["a","d","c","b"]

alphabet.sort()	#오름차순
print(alphabet)
> ["a","b","c","d"]

alphabet.reverse()	#역순(내림차순 아님)
print(alphabet)
> ['b', 'c', 'd', 'a']

4️⃣ Tuple
tuple은 ( ) 로 감싸는 형태며, list와 마찬가지로 순서가 있기 때문에 indexing/slicing이 가능하다. 하지만 한번 생성되면, 값의 수정/삭제 등은 불가능하다. 그래서 dictionary에서 key값으로 사용할 수 있는 것.

example1 = ()
example2 = (1,) #요소가 1개일 때는 반드시 뒤에 콤마(,)가 붙어야 함 
example3 = (1,2,(3,4,5))

#indexing, slicing
print(example3[1:])
> (2,(3,4,5))
print(example3[2][1])
> 4

#길이 구하기
print(len(example2))
> 1 

(x,y) 좌표 형태로 값을 입력할 때 자주 쓰이는데, list로 묶으면 아래와 같이 된다.

coords = [ (4,4),  (5,2),  (-2, 2),  (-3, -4) ]

위의 내용을 이중 list로도 표현할 수 있다.

coords = [ [4,4],  [5,2],  [-2, 2],  [-3, -4] ]

하지만 list는 tuple보다 flexible 하기 때문에 메모리 용량을 더 많이 차지한다.
그래서 데이터 내용에 따라서 list보다는 tuple 형으로 묶는게 더 경제적이다.
dictionary에서 key 리스트나 value 리스트를 뽑을 때, 바로 list 형태로 주지 않고 dict_keys([])dict_values([])로 돌려주는 이유 또한 메모리 낭비를 방지하기 위함이다.

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글