# a라는 이름의 리스트를 생성. 숫자 1, 2, 3, 4, 5로 초기화해서 생성하시오.

a = []
for i in range(1, 6):
a. append(i)
print(a)

 

# a의 요소를 하나씩 출력
for i, j in enumerate(a):
print (j)

# a의 인덱스가 2인 요소의 값을 13으로 변경하시오
i =a.index(2)
a[i] = 13
print(a)

# a의 요소 중 짝수만 출력
even = []
for i, j in enumerate(a):
if j % 2 == 0:
even.append(j)
print(even)

# a의 인덱스가 2인 요소를 삭제하시오

del a[2]
print(a)

# 이름이 b 2 3칸 리스트를 생성, 모두 0으로 초기화해서 생성

b = [[0] * 3] * 2]
print(b)

# 0번줄의 2번방 요소를 10으로 변경

b[0][2] = 10
print(b)


# b의 요소를 0번 줄은 [1, 2, 3], 1번 줄은 [4, 5, 6]로 변경

for i in range(0, 3):
del b[0][0:3]
b.append(i + 1)
print(b)

'''
# b의 모든 요소 출력
for i in range(0, 3):
for j in range(0, 3):
print[i][j]

'''

<2>

집합 데이터를 프로그램에서 효율적으로 다루기 위해

리스트, 셋, 튜플, 딕셔너리 등을 사용할 수 있다.

 

list 변경

set 변경불가

tuple 변경 불가, 함수 반환값

dictionary 

 

변수는 다른 것을 계속 대입해서 값을 변경할 수 있다.

값을 변경하기 싫으면 list를 사용하면 된다.

 

파이썬이나 자바는 할당받지 않은 방보다 더 큰 인덱스에 항목을 입력할 수 없다.

 

리스트를 사용하는 방법은 대괄호로 나열을 하거나 리스트 함수를 사용하거나, 초기화하여 추가하는 방법 등이 있다.

<3>

퀴즈 해석

# 0번줄의 2번방 요소를 10으로 변경

b[0][2] = 10

print(b[0][2])

print(b)

# b의 요소를 0번 줄은 [1, 2, 3], 1번 줄은 [4, 5, 6]로 변경

for in range(0, 3):
del b[0][0:3]
b.append(i + 1)
print(b)

'''
# b의 모든 요소 출력
for i in range(0, 3):
for j in range(0, 3):
print[i][j]

 

얕은복사

a = [1, 2, 3]
b = a
print(a)
print(b)

a[2] = 30
print(a)
print(b)

이렇게 했는데 a[2]만 바꿨는데 b도 바뀌어 버렸다.

그 이유는 참조값이 복사 되었기 떄문이다.

b = a 의 주소값만 복사가 된 거기 때문에, a를 바꾸면 b도 바뀐다. (사실상 a는 b와 같다.)

메모리는 한 개인데 이름만 두개인 꼴..

import copy

a = [1, 2, 3]
b = copy.copy(a)
print(a)
print(b)

a[2] = 30
print(a)
print(b)

copy 함수를 활용할 수 있다. 이걸 쓰려면 import copy() 를 하면 된다

<4>

copy처럼 유용한 함수를 미리 누군가가 구현해둔 라이브러리를 사용할 수 있다.

import copy 처럼 불러와서 사용할 수 있다.

import는 다른 기능들을 불러다 쓸 때 자주 사용한다.

deepcopy도 copy와 비슷한 거다.

opencv에서도 이미지를 처리할 때 얕은카피가 아닌

deepcopy를 사용해야 한다. 얕은복사를 하면 원본 손상이 일어날 수 있다.

 

set : 집합

요소의 중복허용을 허락하지 않는다.

순서가 없다.

요소를 변경하는 건 불가하지만 셋 자체는 변경이 가능하다 (데이터를 삭제하거나 추가하는 건 가능하다)

 

리스트는 인덱스 순서가 있는데 셋은 없다.

중복이 되나 안되나 체크를 하려면 tree 구조를 이용해 정렬해야 한다.

대괄호 ( [ ] ) 가 아닌 중괄호 ( { } ) 로 만든다.

s = {1, 2, 3}
print(s)
print(type(s))

 

이렇게 만들면 

 

 

 

 

리스트처럼 중괄호로 만들면 타입이 딕셔너리로 나올 수 있다.

s = {}
print(type(s))

s= set()
print(type(s))

 

그렇기 때문에 세트를 생성하려면 set함수를 사용해서 생성해야 한다.

 

요소의 순서가 없기 떄문에 인덱스도 없다.

s = {1, 2, 3}
for i in s:
    print(i)

for문을 돌려 요소 값을 하나씩 꺼내는 건 가능하지만 인덱스가 없기 때문에 인덱스를 사용하여 호출하거나 출력하는 것을 불가하다.

 

 

 

s = {'aaa', 1, False}
print(s)

순서가 없기 때문에

 

순서대로 출력되지는 않는다.

 

변경 가능한 요소를 가질 수 없기 때문에 set를 값으로 가질 수 없다. list도 가질 수 없다.

s = {1, 2, {3, 4, 5}}
print(s)
s = {1, 2, [3, 4, 5]}
print(s)

 

그렇기 떄문에 에러가 뜬다.

 

 

셋에 요소를 추가할 수 있다.

add함수를 활용할 수 있다.

s.add('bbb')
print(s)

한개씩만 추가가 가능하기 때문에 여러개를 하려면 다른 함수를 사용해야 한다.

 

여러개를 추가하려면 update 함수를 사용해야 한다.

a = [5, 6, 7]
s.update(a)
print(s)

 

리스트 추가는 안되지만 이렇게 하나씩 리스트 내의 값을 빼내서 추가할 수 있다.

 

요소 삭제도 가능하다.

 

s.remove('aaa')
s.discard(1)
print(s)

 

둘다 삭제하는 건데 remove 함수는 없는 요소를 삭제했을 때 에러가 뜨고 discard는 없는 요소를 삭제해도 에러가 뜨지 않는다.

 

pop함수는 한개씩 빼는거다.

x = s.pop()
print(x, ' 가 삭제됨')
print(s)

x = s.pop()
print(x, ' 가 삭제됨')
print(s)

이렇게 두번 반복을 하면

하나씩 삭제된 것을 확인할 수 있다.

 

clear함수는 모든 요소를 삭제하는 함수이다. 리스트에서도 동일하게 적용된다.

s.clear()
print(s)

 

<점심시간>

<5>

튜플도 집합데이터를 다룬다.

요소도 변경안됨, 튜플도 변경안됨

고정된 집합데이터를 저장하거나 읽는 작업

추가, 삭제도 안돼

다만 우회적으로 변경이 가능하고 MUTABLE 요소도 가능하다.

보통 여러개의 값을 한번에 초기화하는 작업에 많이 사용한다.

a, b, c = 1, 2, 3
print(a)
print(b)
print(c)

 

나열하여 변수 여러개를 초기화

위의 경우에 묵시적으로 튜플이 사용됐다고 본다.

 

튜플을 생성하는 법은 일반 소괄호다.

다른 리스트나 딕셔너리와 괄호의 종류만 달라지지 파이썬 자체에서는 생성하는 법이 거의 비슷하다.

t1 = (1, 2, 3)

튜플은 인덱스 사용이 가능하다.

t1 = (1, 2, 3)
for i in t1:
    print(i, end=', ')
print()

for i in range(0, len(t1)):
    print(t1[i], end=', ')
print()

 

이러하다.

 

리스트를 넣어도 된다.

 

t2 = ('asd', 12, True, [3, 4, 5])
print(t2)

 

 

 

빈 튜플을 생성할 때는 빈 괄호로 할 수 있다.

t3 = ()
print(type(t3))

 

 

다만 값이 한 개인 튜플을 생성할때는 값 하나만 괄호에 넣으면 안된다.

그렇게 되면 그 해당 값의 타입형으로 반환되기 때문에 값에 무조건 

t4 = (1)
print(type(t4))

t5 = (1,)
print(type(t5))

t6 = ('d')
print(type(t6))

t7 = ('d',)
print(type(t7))

 

요소 값이 1개인 튜플을 생성할 때 뒤에 콤마( , ) 를 해줘야 한다.

문자열이든, 숫자든 관계없다.

 

튜플은 생성 이후에 다이렉트로 추가 변경은 어렵지만 우회적으로는 가능하다.

다만, 튜플에 들어가있는 건 안되고 리스트에 들어가있는 항목들만 가능하다.

t1 = (1, 2, 3, 4, [5, 6, 7])
print(t1)

t1[4][0] = 50
print(t1)

t1[4].append(8)
print(t1)

del t1[4][0]
print(t1)

 

 

튜플은 함수의 파라미터ㅏ 어쩌고...

 

딕셔너리

키와 값을 묶어서 저장

키는 중복 허용 안 함. 키는 중복되면 안되지만 값은 중복되도 상관없다..

키의 타입은 변경불가한 값, 값의 타입은 제약이 없다.

요소 추가, 변경, 삭제가 가능하다.

 

키와 값을 묶어서 저장한다.

 

{'name': 'aaa', 'age': '12', 'flag': True}
<class 'dict'>
{1: 'aaa', 2: 'bbbb', 3: 'ccc'}
<class 'dict'>

 

 

 

앞의 것들은 인덱스로 접근했지만 키 이름으로 접근이 가능하다는 게 특징이다.

print(d1['name'])
print(d1['age'])
print(d1['flag'])

 

요소를 접근할 떄 이렇게 가능하다.

요소를 추가할 떄는 

키와 같이 추가해줘야 ㅎ ㅏㄴ다.

d1['tel'] = '1234'
print(d1)

 

이미 있는 키를 추가하면 값이 변경된다. 수정할 떄 이렇게 하면 된다.

d1['name'] = 'bbb'
print(d1)

 

전체 항목을 불러올 떄는

items 함수를 사용할 수 있다.

d1['name'] = 'bbb'
print(d1)

items = d1.items()
print(items)
for i in items:
    print(i)

 

 

 

요소를 삭제하려면 del 함수를 사용하면 된다.

del d1['name']
print(d1)

 

 

요소를 접근할 때 다양한 함수를 사용할 수가 있다.

get함수는 키에 해당하는 값을 반환해준다.

d1['name'] = 'aaa'
print(d1.get('name'))

name에 다시 aaa를 넣고 값을 부르면

 

keys 함수는 키의 목록을 반환해준다. values 함수는 키의 값을 반환해준다.

keys = d1.keys()
print(keys)

vals = d1.values()
print(vals)

이렇게 나온다.

 

 

 

 

for k in keys:
    val = d1[k]
    print(k, ' : ', val)

d1.clear()
print(d1)

 

 

 

사용 빈도수는 리스트가 제일 높다.

+ Recent posts