본문 바로가기
python

네카라쿠배 프론트엔드 취업완성 스쿨 2기 2차 테스트 2일차 학습

by 새우하이 2021. 6. 15.

List

  • 순서가 있다.
  • 중복이 가능하다
  • 수정이 가능하다(mutable)
  • 삭제가 가능하다
  • 중첩리스트 가능하다.
a = []
b = list()
c = [1,2,3,4]
d = [10, 100, 'apple', 'banana']
e = [10, 100, ['apple', 'banana']]

Indexing (인덱싱)

print(d[3])
print(d[-2])
print(d[0] + d[1])
print(e[2][1])
print(e[-1][-2])

리스트의 인덱싱은 간단하다.

2중리스트의 경우 대괄호를 두 번사용하여 [row][column] 순으로 인덱스를 지정해주면 된다.

Slicing (슬라이싱)

print(d[0:2])
print(e[2][0:3])

슬라이싱또한 이전 문자열에서 학습했던것과 같은 매커니즘이다.

연산

print(c + d) # [1, 2, 3, 4, 10, 100, 'apple', 'banana']

리스트끼리 더하는 것이 가능하다.

리스트가 연결되어 출력됨

print(c * 3) # [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
print(c * 1.5) # ERROR TypeError: can't multiply sequence by non-int of type 'float'

마찬가지로 곱셈도 가능하다. 곱셈의 경우 리스트를 n번 반복해준다.

리스트는 int 타입의 곱셈만 가능하다.

수정, 삭제

c[0] = 123
print(c)

c[1:2] = [7,77,777]
print(c)

String과는 다르게 mutable 즉, 수정가능하다.

인덱스를 사용하여 값을 변경하는 것도 가능하고 슬라이싱으로 값을 추가해줄 수 있다.

c[1] = [12,34]
print(c) # [123, [12, 34], 77, 777, 3, 4]

인덱스로 접근하여 리스트를 할당할 경우에는 리스트 자체가 들어가서 이중 리스트가 되게 된다.

del c[0]
print(c)
del c[0:2]
print(c)

삭제는 del을 사용하면된다.

함수

list.append()

# list.append(x)
listX = [1,5,4,2,3]
listX.append(9)
print(listX) # [1, 5, 4, 2, 3, 9]

리스트 끝에 항목을 더해준다. append는 list[len(list):] = [x] 와 동일하게 작동한다.

list.insert(i, x)

listX.insert(2,7)
print(listX) # [1, 5, 7, 4, 2, 3, 9]

append와 비슷한 함수로 insert가 있다. insert는 i에 index, x에 삽입할 요소를 인자로 위치시킨다. list.insert(0, x) 는 리스트의 처음에 요소를 삽입한다. list.insert(len(list), x)는 list.append(x)와 동일하다.

list.sort()

listX.sort()
print(listX) # [1, 2, 3, 4, 5, 7, 9]

listX.sort(reverse=True)
print(listX) # [9, 7, 5, 4, 3, 2, 1]

sort 는 리스트를 제자리에서 정렬한다. 값을 반환하지 않고 listX가 정렬된다.

선택적으로 사용할 수 있는 인자가 두 가지 있다.

key와 reverse가 있는데 key는 하나의 인자를 받는 함수를 지정하여 iterable의 각 요소들로부터 비교키를 추출하는데 사용된다. 쉽게말해 어떤 것을 기준으로 정렬할 것인가에 대한 기준이다. key값을 기준으로 비교하여 정렬할 때 정해줄 수 있는 인자이다.

reverse는 default 값을 False를 가지고있고 True를 입력해주면 내림차순으로 정렬해준다.

list.reverse()

listX.reverse()
print(listX) # [1, 2, 3, 4, 5, 7, 9]

리스트의 요소들을 제자리에서 뒤집는다.

list.remove()

listX.remove(7)
print(listX) #[1, 2, 3, 4, 5, 9]

remove는 del과는 다르게 입력된 값을 찾아 제거해준다. 처음으로 발견한 값하나를 제거한다. 항목이 없으면 ValueError를 일으킨다.

list.pop()

listX.pop(1)
print(listX) # [1, 3, 4, 5, 9]

리스트에서 주어진 인덱스에 있는 항목을 삭제하고 삭제된 항목을 반환한다. 인덱스를 지정하지 않으면 list.pop()은 리스트 마지막의 항목을 삭제하고 반환한다.

list.extend()

ex = [99,88]
listX.extend(ex)
print(listX) # [1, 3, 4, 5, 9, 99, 88]

리스트의 끝에 이터러블의 모든 항목을 덧붙여서 확장한다.

append는 리스트 자체를 삽입하는 반면 extend는 요소를 확장시킨다.

Tuple

순서가 있고 중복이 허용되지만 수정도 안되고 삭제도 안된다. String과같이 immutable 하다.

tp = ()
tp2 = (1,)
tp3 = (1,2,3)
tp4 = 1,2,3
tp5 = (1,2,3,(4,5,6))
del tp2[0] # TypeError: 'tuple' object doesn't support item deletion

리스트와 비슷한 모습을 가진 튜플은 하나의 요소만을 가질 때에는 요소 뒤에 , (콤마)를 사용해야한다. 그리고 ()를 사용하지 않아도 된다.

인덱싱과 슬라이싱도 리스트와 동일하다

print(tp5[1])
print(tp5[3][2])
print(tp5[1:3])

Tuple함수

print(tp5.index(3))
print(tp5.count(3))

index는 튜플의 값이 인자값과 같은것이 몇번째 index에 있는지를 반환하고

count는 인자값이 몇번 등장하는지 횟수를 반환한다.

리스트와 동일하다.

Dictionary

딕셔너리는 순서가 없고 중복도 안된다. 하지만 수정과 삭제가 가능한 mutable 한 특성을 가진다. 딕셔너리는 Key와 Value를 가진다. 이는 Json의 형식도 같다.

Key를 사용해서 값을 조회할 수 있다.

  • 선언
dic = {'name' : 'park', 'phone': '010-1234-1234', 'birth' : 920123, 'list':[1,2,3], 'tuple':(1,2,3)}
print(dic)

key : value 사이에는 ,로 구분을 한다.

키를 숫자로 사용할 수도 있다. 그리고 value에는 list나 tuple등의 여러 자료형이 들어갈 수 있다. 하지만 key에는 문자열, 정수, 실수등만 가능하고 리스트나 튜플은 사용할 수 없다. 딕셔너리의 키의 원소는 hashable 하고 immutable 한 값이어야한다.

더자세히 보기 : https://analytics4everything.tistory.com/m/138

출력

딕셔너리의 값에 접근하는 방식은 몇가지 있는데

print(dic['name'])
# print(dic['nickname'])
print(dic.get('name'))
print(dic.get('nickname'))

dict['name']과 같이 직접 접근할 수도 있지만, 존재하지 않는 key를 조회하면

에러를 발생시킨다. 반면 dic.get() 메서드를 사용하면 존재하지 않는 key값을 조회할 때 None을 반환하여 안전하게 접근할 수 있다.

추가

dic['new'] = '새로운 요소'
print(dic)

dictionary에 key value 쌍을 추가하는 방법은 간단하다.

딕셔너리의 value에 리스트와 튜플을 추가하는 것도 동일하다.

keys(), values(), items()

keys를 사용하면 key 리스트를 반환한다. keys()는 dict_keys객체형태로 반환되기 때문에 리스트형태로 반환을 원하면 list(dic.keys()) 를 사용해야한다.

print(dic.keys())
print(list(dic.keys()))

values()도 마찬가지다.

print(dic.values())
print(list(dic.values()))

items()는

print(dic.items())
print(list(dic.items()))

key, value의 쌍을 반환한다.

이 또한 dict_items 객체로 반환을 하기때문에 list로 형변환하여 사용할 수 있다.

집합(set)

집합은 순서가 없고 중복도 허용하지 않는다. mutable 하다.

a = set()
b = set("Hello")
c = set([1,4,5,6,6])
print(type(a))
print(b)
print(c)

결과

<class 'set'>
{'H', 'e', 'o', 'l'}
{1, 4, 5, 6}

집합 자료형은 set키워드를 사용하여 생성하고, 리스트나 문자열을 입력하여 만들 수 있다.

print된 결과를 보면 알 수 있듯 중복과 순서가 없다. 중복된 요소는 제거된다.

set은 순서가 없기 때문에 인덱싱이나 슬라이싱이 불가능하지만 형변환을 통해 인덱싱할 수 있다.

교집합

교집합은 &과 intersection 함수를 사용하여 구할 수 있다.

s1 = {1,2,3,4,5,6}
s2 = {4,5,6,7,8,9}

print(s1 & s2) # {4,5,6}
print(s1.intersection(s2)) # {4,5,6}

합집합

합집합은 | 와 union 함수를 사용하여 구할 수 있다.

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

중복해서 포함된 값은 제거된다.

+를 사용해서 더하는 연산은 지원하지 않는다.

차집합

차집합은 -와 difference() 함수를 사용하여 구할 수 있다.

print(s1-s2)
print(s1.difference(s2))
print(s2-s1)
print(s2.difference(s1))

추가

값을 추가할 때는 한 개의 값만 추가할 때와 여러개를 추가할 때가 나뉜다.

s1.add(7)
print(s1)

s1.add(7,8) # TypeError: add() takes exactly one argument (2 given)
s1.add([7,8]) # TypeError: unhashable type: 'list'
s1.add((7,8)) # {1, 2, 3, 4, 5, 6, (7, 8)}

한 개만 추가할 때는 add함수를 사용하여 추가하는데

하나 이상의 값을 사용하면 하나의 argument만 사용하라는 에러가 나온다.

리스트나 튜플을 추가하면 어떻게 될까

리스트를 추가하면 unhashable type : 'list' 와 같은 에러가 발생하는데 set이나 dictionary는 immutable 값이어야 한다. list는 mutable한 값이고 tuple은 immutable한 값이기 때문에 추가가 가능한 것이다.

값 여러개 추가

s1.update([7,8])
print(s1)

update는 add 와 다르게 여러개의 값을 추가할 수 있다. 여기서는 list 형태를 사용하는데 그냥 update(7,8) 을 사용하게 되면 TypeError: 'int' object is not iterable 와 같은 에러를 볼 수 있다. iterable이란 그 멤버를 하나씩 차례로 반환 가능한 객체를 의미한다. 따라서 sequence type인 list, str, tuple 의 형태가 필요한 것이다.

특정 값 제거

제거는 remove를 사용한다.

# set.remove(특정값)
s1.remove(2)

remove는 add와 마찬가지로 하나의 argument만 가질 수 있다.

조건문

조건문에서 가장 중요한것은 boolean이다.

#if 조건 :
#    실행
if True:
    print("YES")

if False:
    print("No")
else:
    print("YES2")

조건이 True 즉 참일 때 아래의 코드가 실행된다.

조건이 참이 아닐 때는 실행하지 않지만 else 로 참이 아닐 때 실행할 코드를 작성할 수 있다.

관계연산자

a = 10
b = 0

print( a == b )
print( a != b )
print( a > b )
print( a < b ) 
print( a >= b ) 
print( a <= b )

관계 연산자를 사용하면 True 와 False를 반환하는데 이를 조건문에서 활용할 수 있다.

참 거짓에는 True와 False 도 있지만

내용이 있는 문자열, 요소가 있는 리스트, 튜플, 딕셔너리, 그리고 숫자 1도 True 값을 가진다.

반대로 빈 문자열, 리스트, 튜플,딕셔너리와 숫자 0 은 False를 가진다.

if [] :
    print("True")
else:
    print("False")
# 빈 리스트  => False

if "test" :
    print("True")
else:
    print("False")

# 내용이 있는 문자열 => True

논리연산자

and,or,not 이 있다.

a = 3
b = 2
c = 1 
print('and : ', a > b and b > c)
print('or : ', a > b or c > b)
print('not : ', not a > b)

and는 둘다 만족할 때, or는 둘 중 하나를 만족할 때 True를 반환한다.

not은 결과를 반전하여 반환한다.

연산자 우선순위

산술 > 관계 > 논리 순으로 우선순위가 정해진다.

print(5 + 10 > 0 and not 7 + 3 == 10)

결과로 False가 출력될 것이다.

우선 덧셈이 실행될 것이고 그다음 관계연산자인 > , == 이 실행되고 그다음 and 와 not이 수행된다. 그럼 결과로 True and False의 결과가나와서

False가 출력

다중 조건문

score = 90
if score >= 90:
    print("등급 A")
elif score >= 80:
    print("등급 B")
elif score >= 70:
    print("등급 C")
else:
    print("등급 F")

이처럼 elif 를사용해서 if문이 참에 해당하지 않는다면 다음에 새로운 조건을 내걸어 확인하는 것이다.

else 는 조건이 없이 if문이 거짓인경우 실행되지만, elif는 새 조건에 참이면 실행하지만 아니면 무시한다.

elif들을 하나하나 확인하며 내려가다가 참인 값을 만나면 조건문을 반환한다.

중첩 조건문

age = 27
height = 175
if age >= 20:
    if height >= 170:
        print("A지망 지원가능")
    elif height >= 160:
        print("B 지망 지원 가능")
    else:
        print("지원불가")
else:
    print("20세 이상 지원 가능")

중첩 조건문은 조건을 세부적으로 확인할 수 있다.

age가 20 미만이면 if height ≥ 170을 확인할 필요도 없이 거짓으로 else 문으로 빠져나가고 age ≥ 20을 만족하면 height의 조건문을 확인하며 해당하는 값을 출력한다.

반복문

데이터사이언스분야에서 조건문과 반복문을 사용해서 텍스트마이닝 등에 많이 사용한다.

반복문은 특정 행동을 반복해야할 때 사용할 수 있다. 대표적으로 for과 while문이 있다.

while 문

while 문은 표현식이 참인동안 실행을 반복한다.

while <조건문> :
    <수행>
    ...

보통은 while문 내부에서 증감 연산을 사용하여 조건문을 빠져나올 수 있게 한다.

ten = 0
while ten != 10 :
    ten += 1

위의 반복문은 ten 이 10이 되는 순간 while문의 조건문이 거짓이 되며 탈출하게 된다.

for문

for 변수 in 리스트(혹은 튜플, 문자열)
    <수행>
    ...

리스트 혹은 튜플, 문자열을 첫 요소부터 마지막 요소까지 변수에 대입하며 수행한다.

range 함수를 사용해서 수행할 수 있는데 range함수는 숫자들의 시퀀스로 이터레이트할 필요가 있을 때 사용한다. 이는 수열을 만든다.

for i in range(5):
    print(i)

를 수행하면 0~4까지 5번의 반복수행된다.

range에서 끝 값은 만들어지는 수열에 포함되지 않는다.

range는 범위를 지정할 수도 있는데 앞서 리스트와 문자열에서 사용했던 슬라이싱처럼 step(단계) 를 지정할 수 있다.

range(5,10) # 5 6 7 8 9
range(0, 6, 2) # 0 2 4 
---
for i in range(0, 6, 2): 
    print(i)
# 0 2 4

시퀀스 자료형은 값이 연속적으로 이어져 있는 것을 볼 수 있다. 리스트, 튜플, range(), 문자열, 딕셔너리, 집합 등이 있고 이런 시퀀스 자료형은 특정 값이 있는지( in, not in )확인 가능하고, 객체 연결이 가능하다. iterable 은 각 요소를 하나씩 반환할 수 있는 객체를 의미함.

iterable : range, reversed, enumerate, filter, map, zip 등에서 iterable을 반환할 수 있음.

names = ["kim", "park", "Cho", "Choi", "Yoo"]
for name in names:
    print("He is ", name)

리스트는 이터러블 리턴을 하기 때문에 하나씩 name에 담아 출력이 가능하다.

str1 = "Hello"
for i in str1:
    print(i)

문자열도 마찬가지.

딕셔너리에서는

for key in dict:
    print(key)

출력:

name
age
city

key만 반환하는것을 볼 수 있다.

for key in dict.values():
    print(key)
for key in dict.keys():
    print(key)
for key,value in dict.items():
    print(key , value)

딕셔너리의 values(), keys(), items()를 활용해서 해결할 수 있다.

break

반복문을 즉시 탈출할 수 있는 것이 break이다.

내가 원하는 데이터를 찾거나 의도하는 값을 만들어 냈을 때 빠져나올 수 있게 해주는 것이다.

numbers = [14, 2, 64, 22, 39, 88, 33, 52, 8]
for num in numbers:
    if num == 33:
        print("found 33")
    else:
        print("not found 33")

이런 반복문이 있다. 중간에 33을 만나 found를 출력하겠지만 다음 num을 검사하면서 계속 진행 될 것이다. 이럴때 break를 통해 원하는 값을 찾았으니 반복문을 빠져나올 수 있다.

numbers = [14, 2, 64, 22, 39, 88, 33, 52, 8]
for num in numbers:
    if num == 33:
        print("found 33")
        break
    else:
        print("not found 33")

이렇게 하면 33에서 반복문을 종료할 것이다.

for문에도 else문을 쓸 수 있다

for else

if처럼 for문도 else절을 가질 수 있다. 반복문의 이터러블 소진이나 (while 의경우엔 )조건이 거짓이 되어 종료할 때 실행된다.

하지만 break에 의해 종료될 때는 실행되지 않는다.

numbers = [14, 2, 64, 22, 39, 88, 37, 52, 8]
for num in numbers:
    if num == 33:
        print("found 33")
        break
else:
    print("not found 33 ....")

이 코드에서 for문은 리스트를 순회하며 조건문을 검사한다. 하지만 리스트에 33이 없기 때문에 리스트를 전부 순회할 것이다. 이때 for ~ else 는 모든 이터러블이 소진되었을 때 else문을 실행한다.

lt = ["1", 2, 3, True, 4.3, complex(4)]

continue

continue는 반복문의 다음 이터레이션을 계속하도록 한다.

lt = ["1", 2, 3, True, 4.3, complex(4)]
for v in lt:
    if type(v) is float:
        continue
    print("타입 : ", type(v))

결과

타입 : <class 'str'>
타입 : <class 'int'>
타입 : <class 'int'>
타입 : <class 'bool'>
타입 : <class 'complex'>

다양한 타입의 요소를 가진 리스트를 순회하며 조건문을 실행하는 예제를 보자.

조건문에 의해 v가 flat형일 때 continue가 수행된다.

결과를 보면 float형만 빼고 모두 출력해준다.

continue에 의해 float형은 print를 건너 뛰고 다음 이터러블을 가지고오게 한다.

댓글