본문 바로가기
Python 과 머신러닝/I. 기초 문법

Python 기초 3장. 자료구조

by JoyfulS 2019. 9. 30.

< 공부한 내용 >

1. List

2. Tuple

3. Set

4. Dict

 

1. List

'''
list 특징
- 1차원 배열구조(vector)
- 형식) 변수 = [1, 2, ..., 3]
- 다양한 자료형 저장 가능
- 순서를 보장
-> index 사용 : 0부터 시작
- 수정, 추가, 삽입, 삭제
'''

# 1. 단일 list
lst = [1,2,3,4,5]
print(len(lst)) # 5

for i in lst :
     # print(i, end=' ') # 1 2 3 4 5
     # print(lst[ i-1: ]) # [ start : end ] (0번째 인덱스 ~ 4번째 인덱스에서 시작)
     print(lst[ : i ])

# index 사용
x = list(range(1, 101))
print(x) # 전체 원소 출력
# index 형식 : 변수[n]
print(x[:5]) # [1, 2, 3, 4, 5] (인덱스 0~4까지 출력, 앞에서 5개 출력)
print(x[-5:]) # [96, 97, 98, 99, 100] (끝에서 5개 출력)
'''
변수[:n]
변수[n:]
변수[start:stop:step] # step 생략시 1씩 증가
'''
print(x[:10:2]) # [1, 3, 5, 7, 9]
print(x[:]) # 전체
print(x[::2]) # 홀수 위치

# 2. 중첩 list
'''
[ [ ], [ ] ]
'''

a = ['a', 'b', 'c'] # 단일 list
b = [10, 20, a, True, "문자열"] # 중첩 list ( a = ['a', 'b', 'c'] )

print(b)
print(b[2]) # ['a', 'b', 'c']
print(b[2][1]) # b
print(b[2][1:]) # ['b', 'c'] - 단일변수가 아닐 경우, list로 묶여서 출력됨

print(type(a),type(b)) # <class 'list'> <class 'list'>

 


# 3. 수정, 추가, 삽입, 삭제
num = ['one', 'two', 'three', 'four']
print(len(num)) # 4
print(type(num)) # <class 'list'>

# 원소 추가 : 함수 이용
# object.member
num.append('five')
print(num) # ['one', 'two', 'three', 'four', 'five']

# 원소 삭제 : 함수 이용
num.remove('five')
print(num) # ['one', 'two', 'three', 'four']

# 원소 수정 : index 이용
num[2] = 3
print(num) # ['one', 'two', 3, 'four']

# 원소 삽입 : 함수 이용
num.insert(0, 'zero') # 0번 인덱스 자리에 끼워넣겠다.
print(num) # ['zero', 'one', 'two', 3, 'four']


# 4. list 연산

# 1) list 결합
x = [1,2,3,4]
y = [1.5, 2.5]
z = x + y
print('z=', z) # z= [1, 2, 3, 4, 1.5, 2.5]

# 2) list 확장
x.extend(y) # old object, 기존에 있던 객체를 확장하는 것! vs 결합은 새로운 객체를 만드는 것!
# extend에는 iterable(연속된 변수, 2개 이상의 변수) 입력해야함
print('x=', x) # x= [1, 2, 3, 4, 1.5, 2.5]

# 3) list 추가
x.append(y)
print('x=', x) # x= [1, 2, 3, 4, 1.5, 2.5, [1.5, 2.5]]

# 4) list 곱셈
# x = [1, 2, 3, 4] * 2
result = x * 2 # x의 원소 2배 확장
print(result) # [1, 2, 3, 4, 1, 2, 3, 4]

# x = [1, 2, 3, 4] * 0.5
# 각 변량에 0.5를 곱하려면 for문을 이용해야함
for i in x :
     print(i * 0.5, end=' ') # 0.5 1.0 1.5 2.0

# 5. list 정렬
import random

r = [] # list
for i in range(5) :
     r.append(random.random()) # 0~1 난수 실수

print('r=', r)

r.sort() # 오름차순 # default
print(r)
r.sort(reverse=True) # 내림차순
print(r)

# 6. list에서 원소 찾기
r2 = [] # list

for i in range(10) :
     r2.append(random.randint(1,5)) # 1~5 사이 난수 정수

print(r2) # [2, 4, 5, 4, 2, 4, 3, 5, 2, 5]

if 4 in r2 :
     print("찾는 값 4가 있음")
else :
     print("찾는 값 없음")

 

 

# 7. list 내포

'''
list 내포 ( list 내 for)
- list 안에 for문 포함
- 형식1) 변수 = [ 실행문 for 변수 in 열거형객체 ]
실행순서 : 1. for > 2. 실행문 > 3. 변수 할당
- 형식2) 변수 = [ 실행문 for 변수 in 열거형객체 if 조건식 ]
실행순서 : 1. for > 2. if 조건식 > [3.실행문 > 4. 변수 할당]
'''

x = [2, 4, 1, 5, 3]
# x의 각 변량에 제곱 적용 : x ** 2
# x ** 2 # Error

result = [ i ** 2 for i in x ]
print(result) # [4, 16, 1, 25, 9]

# for + list
result = []
for i in x :
     calc = i **2
     result.append(calc)
print(result) # [4, 16, 1, 25, 9]

# list 내포 형식2


# 1~100 사이 3의 배수 추출
num = list(range(1,101))
print(num)

result2 = [i for i in num if i%3 == 0]
print(result2)

 

 

2. Tuple

'''
tuple 특징
- list와 공통점 : 순서 보장, index 사용
- list와 차이점 : 읽기전용(read only)
- 형식) 변수 = (1, 2, ..., n)
- list에 비해서 처리속도 빠름
'''

# 1. tuple 생성
t = (1,2,3,4,5)
print(type(t)) # <class 'tuple'>
print(len(t)) # 5
print(max(t)) # 5
print(min(t)) # 1

# 2. tuple 수정(삽입, 추가, 삭제) 불가
print(t[0]) # 1
print(t[-1]) # 5
print(t[2:5]) # (3, 4, 5)

# t[0] = 'zero' # 수정 불가 - error

# 3. tuple 수정 -> list 변환
lst = list(t)  # tuple -> list
print(lst) # [1, 2, 3, 4, 5]
lst.remove(3)
t2 = tuple(lst)  # list -> tuplet
print(t2) # (1, 2, 4, 5) # 소괄호로 묶여있으면 tuple

 

 

3. Set

'''
set 특징
- 집합의 개념
- 형식) 변수 = {1, 2, 3, ..., n}
- 순서 없음(index 사용 불가)
- 중복 불가
'''

# 1. set 생성
s = {1, 3, 5, 3} # 3은 이미 있어서 1번만 저장
print(s) # {1, 3, 5}
print(len(s)) # 3

# 2. for + set
for i in s :
     print(i, end=' ') # 1 3 5

     # 순서가 있어보이지만... 데이터 양이 많으면 데이터 순서 없이 꺼내진다는 것 확인 가능

lst = list(range(1,101))
s2 = set(lst)
print(s2)

for i in s2 :
     print(i, end=' ')

print(s2[0]) # TypeError

# 3. 집합의 개념
s = {1, 3, 5}
s2 = {3, 7}

print(s.union(s2)) # 합집합 : {1, 3, 5, 7}
print(s.difference(s2)) # 차집합 : {1, 5}
print(s.intersection(s2)) # 교집합 : {3}

# 4. 중복 데이터 제거
gender = ['', '', '', ''] # list
sgender = set(gender) # list -> set
print(sgender) # {'', ''} - 순서 없음

lgender = list(sgender)
print(lgender) # ['', ''] - 순서 있음
print(lgender[0]) #

# 5. 원소 추가, 삭제
s3 = {1, 3, 5}

s3.add(7) # {1, 3, 5, 7}
print(s3)

s3.remove(3)
print(s3) # {1, 5, 7}

 

 

4. Dict

'''
dict 특징
- set과 유사함 : 순서 없음
- 형식) 변수 = {1:1, 2:2, 3:3, ... , n:n}
- key는 중복불가, value는 중복가능
- key를 이용해서 value 참조
   변수[key2]
- 찾는 속도가 빠름 : 직접 접근 방식
'''

# 1. dict 생성

# 1) dict() 이용
dic1 = dict(key1 = 100, key2 = 300, key3 = 400)
print(dic1)  # {'key1': 100, 'key2': 300, 'key3': 400}
print(len(dic1)) # 3
dic1['key2'] # 300

# 2) {} 기호 이용
dic2 = {'name' : '홍길동', 'age':35, 'addr' : '서울시'}
print(dic2)
print(type(dic2)) # <class 'dict'>

# 나이 추출
age = dic2['age'] # 35
age2 = dic2.get('age') # 35

# 2. 키(key) 유무 검사하기
print('age' in dic2) # True

# 3. 원소 수정, 삭제, 추가
dic2['age'] = 45
print(dic2)

print(len(dic2)) # 3
dic2['gender'] = "남자"
print(dic2) # {'name': '홍길동', 'age': 45, 'addr': '서울시', 'gender': '남자'}

del dic2['gender']
print(dic2) # {'name': '홍길동', 'age': 45, 'addr': '서울시'}


# 4. for + dict
# 1) for k in dic2.keys() :
for k in dic2.keys() :    # dict_keys(['name', 'age', 'addr'])
     print(k, "->", dic2[k])
# name -> 홍길동
# age -> 45
# addr -> 서울시

# 2) for v in dic2.values() :
for v in dic2.values() :
     print(v)
# 홍길동
# 45
# 서울시

# 3) key + value
for i in dic2.items() :
     print(i)
# ('name', '홍길동')
# ('age', 45)
# ('addr', '서울시')
for k, v in dic2.items() :
     print(k, v)
# name 홍길동
# age 45
# addr 서울시

 


# 5. 단어 빈도수 구하기
word_vec = ["love", "word", "love", "cat", "word"]
print(len(word_vec)) # 5

wc = {}    # set : word count

for word in word_vec :
     wc[word] = wc.get(word, 0) + 1
# get(0) : 해당 key value값 호출
# wc.get(word, 0) : word의 값을 가져오는데, 값이 없다면 0

print(wc) # {'love': 2, 'word': 2, 'cat': 1}

wc2 = {} # set
for word in word_vec :
     if word in wc2 :  # 넘어온 값이 기존에 wc2에 있다면
          wc2[word] += 1
     else # 최초 단어 발견
          wc2[word] = 1

print(wc2) # {'love': 2, 'word': 2, 'cat': 1}

 

 


# list : [ ], tuple : ( ), set : { }, dict : { key : value }

 

 

--------------------------------------------------- example ---------------------------------------------------

 

exam01.py
0.00MB
exam02.py
0.00MB
exam03.py
0.00MB
exam04.py
0.00MB
exam05.py
0.00MB

댓글