<리스트>
- 다양한 자료형을 담을 수있는 배열형태의 자료형
- [ ]로 표현하고 쉼표(,)로 구분
- 인덱스를 이용해서 리스트의 특정 요소에 접근하거나 순서를 구할 수 있음
- 추가, 삭제, 수정 가능
# 리스트
friuts = ["사과", "배", "딸기", "귤"]
print(friuts.index("딸기")) # 딸기 몇 번째에 있어
friuts.append("망고") # 리스트 끝에 요소 추가
friuts.insert(1, "수박") # 숫자 먼저 작성해주기
print(friuts) # ['사과', '수박', '배', '딸기', '귤', '망고']
friuts.pop() #뒤에서 부터 제거
print(friuts) # 망고 제거
friuts.append("사과")
print(friuts.count("사과")) # 2
del friuts[3] # 원하는 요소 지정 제거
friuts.remove("사과")
# 숫자 정렬
numbers = [5, 4, 2, 1, 3]
numbers.sort()
print(numbers)
# 순서 뒤집기
numbers.reverse()
print(numbers)
# all clear
numbers.clear()
print(numbers)
#리스트 확장
fruits1 = ["apple", "banana"]
fruits2 = ["orange", "kiwi"]
fruits1.extend(fruits2)
print(fruits1) # ['apple', 'banana', 'orange', 'kiwi']
<딕셔너리>
- key와 value의 쌍으로 이뤄져 있는 자료형. {}로 정의함
- key는 유일한 값을 가져야한다
# 딕셔너리 생성
my_dict = {"apple": 2, "banana": 3, "cherry": 5}
# 딕셔너리 출력
print(my_dict)
print(my_dict.keys()) # 키값만 출력
print(my_dict.values()) # value값만 출력
# 딕셔너리에서 값 찾기
print(my_dict["apple"]) # 2
# print(my_dict["melon"]) # []로 값 찾을 때 키 값 없으면 Error발생 후 종료
print(my_dict.get("banana"))
# get을 사용하면 키 값이 없어도 None표시 후 진행됨, None대신 표시하는 문자열 지정가능
print(my_dict.get(2, "값이 없습니다"))
# 딕셔너리에서 값 변경
my_dict["banana"] = 4
print(my_dict) # {"apple": 2, "banana": 4, "cherry": 5}
# 새로운 키-값 쌍 추가
my_dict["orange"] = 1
print(my_dict) # {"apple": 2, "banana": 4, "cherry": 5, "orange": 1}
# 딕셔너리에서 키-값 쌍 삭제
del my_dict["cherry"]
print(my_dict) # {"apple": 2, "banana": 4, "orange": 1}
# 딕셔너리 Boolean
print("apple" in my_dict) # True
my_dict.clear()
print(my_dict) # {}출력 / 모두 clear
<튜플>
- 리스트보다 속도가 빠름 -> 변경되지 않는 리스트를 사용할 때
- 리스트랑 유사하게 요소에 인덱스로 접근 가능
- 불변성 : 생성 후 변경 불가 -> (x,y)좌표나 날짜, 시간 저장 시
- 괄호() 사용 표기 ex) (1, 2, 3)
nums = (1, 2, 3)
print(nums[0])
(name, age) = ("chulsoo", 24) #튜플은 한번에 여러 튜플 선언 가능 ; 튜플 패킹(tuple packing)
print(name, age) # chulsoo 24
<세트>
- 집합을 구현 할 때, 중복제거 가능
- 교집합/합집합/차집합 구할 수 있음
- 딕셔너리와의 차이점 : 모두 중복제거 하지만 딕셔너리는 각 값에 대응하는 고유 key를 가지며 세트는 값 자체 저장, 순서없음, 값 조회와 수정 불가능
nums = {1, 3, 4, 5, 2, 2, 1, 3}
print(nums) # 출력 : {1, 2, 3, 4, 5}
set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}
# 합집합
print(set1.union(set2))
print(set1 | set2)
# 교집합
print(set1.intersection(set2))
print(set1 & set2)
# 차집합
print(set1.difference(set2))
print(set1 - set2)
# 대칭차 (서로 다른 값만)
print(set1.symmetric_difference(set2))
print(set1 ^ set2)
# 값 추가
set1.add(9)
print(set1)
# 값 제거
set1.remove(1)
print(set1)
<자료구조 변경>
data = [1, 2, 3, 4, 5]
print(data, type(data)) # 자료구조 타입 출력
set_data = set(data)
print(set_data)
tuple_data = tuple(set_data)
print(tuple_data)
# 출력
[1, 2, 3, 4, 5] <class 'list'>
{1, 2, 3, 4, 5}
(1, 2, 3, 4, 5)
<shuffle(), sample()> - 둘다 random에 포함되어있음
1. shuffle() 함수
-리스트 무작위 섞음
import random
my_list = [1, 2, 3, 4, 5]
random.shuffle(my_list)
print(my_list) # [3, 4, 1, 2, 5] 등 순서 섞여서 나옴
2. sample() 함수
- 시퀀스 자료형(순서를 가진 자료형)에서 일부 요소 임의 추출
import random
my_list = [1, 2, 3, 4, 5]
sample_list = random.sample(my_list, 3) # (시퀀스 자료형 지정, 몇 개 추출할 지)
print(sample_list) # [2, 1, 3]
my_string = 'Hello, World!'
sample_string = random.sample(my_string, 5)
print(sample_string) # ['r', 'W', 'd', 'H', 'l']
+) 여기서는 import random 해서 random.sample() 이런식으로 적어줬는데
만약 from random import *
이렇게 임포트했다면 그냥 sample만 적어주면 됨..
+) from random import * 대신 import random을 사용하고, random.sample()과 같이 모듈 이름을 명시적으로 적어주는 것을 권장함 -> python에서 모듈이름이나 함수이름이 중복되면 충돌할 수도 있고 가독성 높이기 위해서.. 그리고 코드가 길어질 수록 모듈에서 어떤함수를 가져왔는 지 알기 어렵기 때문