7 minute read

리스트

numbers = [1, 2, 3, 4, 5]
리스트 안의 값들을 요소라고 한다.

인덱싱

리스트에서 요소의 위치를 인덱스라고 하고 인덱스를 통해 요소를 받아 오는걸 인덱싱이라 한다.

numbers = [1, 2, 3, 4, 5]

print(numbers[0]) -> 1
print(numbers[1]) -> 2

마이너스 인덱스는 뒤에서 부터 센다.
print(numbers[-1]) -> 5
print(numbers[-2]) -> 4

값을 바꿀 수 도 있다.
numbers[0] = 7
print(numbers) -> [7, 2, 3, 4, 5]

리스트 슬라이싱

numbers = [1, 2, 3, 4, 5]

print(numbers[0:2]) -> [1, 2]
인덱스 0부터 1까지를 자른다.

print(numbers[1:]) -> [2, 3, 4, 5]
인덱스 1부터 끝까지를 자른다.

print(numbers[:3]) -> [1, 2, 3]
인덱스 처음부터 2까지를 자른다.

리스트 함수

len()

리스트에 요소가 몇개 있는지 리턴한다.

numbers = [1, 2, 3, 4, 5]
print(len(numbers)) -> 5

.append()

기존의 리스트에 값을 추가할 때 사용한다. 값은 리스트의 가장 오른쪽에 추가된다.

numbers = [1, 2, 3, 4, 5]
numbers.append(7)
print(numbers) -> [1, 2, 3, 4, 5, 7]

del

리스트에 요소를 삭제할때 사용한다.

numbers = [1, 2, 3, 4, 5]
del numbers[3]
print(numbers) -> [1, 2, 3, 5]

3번 인덱스의 요소가 삭제됐다.

.insert()

리스트에 요소를 삽입할 때 사용한다.

numbers = [1, 2, 3, 4, 5]
numbers.insert(2, 7)
print(numbers) -> [1, 2, 7, 3, 4, 5]

2번 인덱스에 7이 삽입됐다.

리스트 정렬

sorted()

sorted함수는 기존의 리스트를 건드리지 않고 정렬된 새로운 리스트를 만들어서 리턴한다.

numbers = [5, 3, 4, 1, 2] print(sorted(numbers)) -> [1, 2, 3, 4, 5]
print(sorted(numbers, reverse=True)) -> [5, 4, 3, 2, 1]
print(numbers) -> [5, 3, 4, 1, 2]

기존의 리스트인 numbers를 출력하면 원래의 모습 그대로다.

.sort()

sort함수는 기존의 리스트를 재정렬하고 아무것도 리턴하지 않는다.

numbers = [5, 3, 4, 1, 2] numbers.sort() print(numbers.sort(reverse=True)) -> None
print(numbers) -> [5, 4, 3, 2, 1]

기존의 리스트인 numbers를 출력하면 값이 바뀌어 있다.

in

리스트에 어떤 값이 있는지 확인할 수 있다.

numbers = [5, 3, 4, 1, 2]
print(5 in numbers) -> True
print(7 in numbers) -> False

반대로 값이 없는지 확인하려면 not을 붙이면 된다.

print(7 not in numbers) -> True

nested list

리스트 안에 또다른 리스트를 말한다.

numbers = [[1, 2, 3], [5, 6, 7]] print(numbers[0]) -> [1, 2, 3]
print(numbers[1]) -> [5, 6, 7]
print(numbers[0][1]) -> 2
print(numbers[1][2]) -> 7

.reverse()

값들을 뒤집어진 순서로 배치한다.

numbers = [1, 2, 3, 4, 5]
numbers.reverse()
print(numbers) -> [5, 4, 3, 2, 1]

.index()

해당 값을 가지고 있는 인덱스를 리턴해 준다.

numbers = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
print(numbers.index(‘a’)) -> 0

.remove()

첫 번째로 해당 값을 가지고 있는 원소를 삭제한다.

numbers = [‘a’, ‘b’, ‘c’, ‘a’, ‘e’]
numbers.remove(‘a’)
print(numbers) -> [‘b’, ‘c’, ‘a’, ‘e’]

for 반복문

for 변수 in 리스트/튜플/문자열:
    수행 부분

numbers = [1, 2, 3, 4, 5]

for i in numbers:
    print(i)

numbers리스트의 처음 인덱스 부터 변수 i에 들어가면서 반복된다.

range()

range함수를 쓰면 리스트를 작성하지 않아도 돼서 메모리 효율성이 좋다.

파라미터 1개

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

0부터stop - 1까지

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

0부터 9까지 출력된다.

파라미터 2개

for i in range(start, stop):
    print(i)

start부터 stop - 1까지

for i in range(1, 11):
    print(i)

1부터 10까지 출력된다.

파라미터 3개

for i in range(start, stop, step):
    print(i)

start부터 stop - 1까지, 간격 step

for i in range(1, 11, 3):
    print(i)

1, 4, 7, 10이 출력된다.

사전

Key와 value가 한 쌍을 이룬다.

dict = {
    5: 25,
    2: 4,
    3: 9
}

콜론 기준으로 왼쪽이 key, 오른쪽이 value다.

키를 사용해 값을 가져올 수 있다.
print(dict[3]) -> 9

새로운 쌍을 추가하려면 이렇게 한다.
dict[7] = 70
print(dict) -> {5: 25, 2: 4, 3: 9, 7: 70}

리스트와 사전의 차이점

리스트는 인덱스가 순서대로 올라가지만 사전은 키를 순서에 상관없이 아무렇게나 지정할 수 있다.
리스트의 인덱스는 정수형이지만 사전의 키는 아무 자료형이나 쓸 수 있다.

.values()

  • 사전에 있는 값들을 확인할 수 있다.
    print(dict.values()) -> dict_values([25, 4, 9])

  • 사전에 특정 값이 있는지 확인할 수 있다.
    print(25 in dict.values()) -> True

  • for문 for value in dict.values():     print(value) -> 25, 4, 9

.keys()

  • 사전에 있는 키들을 확인할 수 있다.
    print(dict.keys()) -> dict_keys([5, 2, 3])

  • 사전에 특정 키가 있는지 확인할 수 있다.
    print(5 in dict.keys()) -> True

  • for문 for key in dict.keys():     print(key) -> 5, 2, 3

.items()

for key in dict.keys():
    value = dict[key]
    print(key, value)

이 과정을 items를 사용해 간단히 할 수 있다.

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

key와 value를 동시에 받아올 수 있다.

aliasing

가변형 : dict, list
불변형 : tuple, str, int, bool, float

a = 5 가 있으면 a가 5를 참조한다고 한다.
변수 = 객체 는 변수가 객체를 참조하는 것이다.

x = 5
y = x
y = 3
print(x)
print(y)

x = 5 —> 5를 x가 참조한다.
y = x —> 동일한 5를 y가 참조한다.
현재 x와 y는 같은 5를 참조한다.
이 상태에서 y = 3 을 하면 5가 3으로 바껴야 겠지만 정수는 불변형이므로 새로운 3을 만들고 그 3을 y가 참조한다.
그래서 x는 5와 y는 3이 출력된다.

x = [1, 2, 3]
y = x
y[2] = 7
print(x)
print(y)

x = [1, 2, 3] —> 리스트를 x가 참조한다.
y = x —> 동일한 리스트를 y가 참조한다.
현재 x와 y는 같은 리스트를 참조한다.
이 상태에서 y[2] = 7 을 하면 리스트는 가변형이므로 현재 리스트의 2번 인덱스 값이 7로 바뀐다.
여전히 x와 y는 동일한 리스트를 참조하므로 x와 y의 출력값은 [1, 2, 7]로 동일하다.

여기서 y는 x의 가명(alias)이라고 한다. 이름은 다르나 같은 값이라는 말이다.

가변형 타입에서 이런 문제를 해결하려면 list함수를 사용하면 된다.

list()

x = [1, 2, 3]
y = list(x)
y[2] = 7
print(x)
print(y)

list함수는 새로운 리스트를 생성한다.
기존의 방식에서 y = x 는 같은 리스트를 참조하는 반면에 y = list(x)는 x리스트의 복제본을 새로 생성하고 새로 생성된 리스트를 y가 참조한다.
그래서 x와 y는 서로 다른 리스트를 참조하게 되고 y[2] = 7 을 해서 값을 변화시키면 y가 참조하고 있는 리스트의 값만 변경된다.

리스트와 문자열

리스트와 문자열은 구조적으로 비슷하다.
인덱싱, for반복문, 슬라이싱, 덧셈연산, len함수 들을 동일한 방법으로 사용할 수 있다.
다만 문자열은 리스트와 달리 수정이 불가능하다.

numbers = [1, 2, 3, 4, 5]
numbers[0] = 7

리스트는 수정이 가능하지만

numbers = "12345"
numbers[0] = 7

문자열은 에러가 나게된다.
문자열에 덧셈연산이 가능한 것은 str = ‘abc’ + ‘asd” 는 문자열을 수정한게 아니라 새로운 문자열을 생성한 것이기 때문이다.

모듈

모듈은 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일이다.
같은 폴더에 있는 파이썬 파일은 import 파일이름 으로 불러올 수 있다.

import calculator

print(calculator.add(2, 5))

calculator모듈에서 add함수를 가져와 사용한다.

import calculator as cal

print(cal.add(2, 5))

이렇게 불러온 모듈의 이름을 대체할 수 도 있다.

from calculator import add

print(add(2, 5))

이렇게 특정 함수를 불러와 모듈을 생략하고 사용할 수 있다.

스탠다드 라이브러리

파이썬을 설치할 때 스탠다드 라이브러리도 포함되어 있다.

random

import random

print(random.random())
print(random.randint(1, 20))
print(random.uniform(0, 1))

random함수는 랜덤한 수를 리턴한다.
randint함수는 두 수 사이의 랜덤한 정수를 리턴한다.
위의 경우에는 1 <= N <= 20
uniform함수는 두 수 사이의 랜덤한 소수를 리턴한다.
위의 경우에는 1 <= N <= 1

datetime

import datetime

day = datetime.datetime(2020, 10, 10)
day1 = datetime.datetime(2020, 10, 10, 20, 31, 27)
day2 = datetime.datetime.now()
day3 = day2 = day1
print(day1.year)
print(day1.strftime("%A, %B %dth %Y"))

datetime으로 시간을 생성할 수 있다.
datetime.now로 현재 시간을 생성한다.
시간끼리 차를 구할 수 도 있다.
datetime값에서 연도, 월 같은 값들을 추출할 수 있다. year, month, day, hour, minute, second, microsecond
strftime을 사용해 datetime을 포맷팅 할 수 있다.

input

사용자로 부터 정보를 받을 수 있다.

val = input("값을 입력하세요 : ")
print(val)

input이 받는 사용자 입력은 항상 문자열이다.

파일 읽기/쓰기

파일 읽기

with open('파일이름', 'r') as f:
    for line in f:
        print(line)

파일이 다른 폴더에 있다면 ‘폴더이름/파일이름’ 이렇게 하면 된다.
읽어 들인 파일을 f라는 변수에 저장한다.
for문을 돌려 내용을 출력할 수 있다.

한글 관련된 문제가 생기면 UTF-8을 추가해 주면 된다.

with open('파일이름', 'r', encoding='UTF-8') as f:
    for line in f:
        print(line)

.strip()

문자열 앞뒤의 화이트 스페이스를 제거해 준다.

print("   abc   asd   ".strip())

결과 - “abc asd”

외부 파일을 읽을 때 작성한 파일에서 줄바꿈이 있다면 print함수에서도 자동으로 줄바꿈을 하기 때문에 줄바꿈이 두번이 된다.
이렇때 사용하면 유용하다.

with open('파일이름', 'r') as f:
    for line in f:
        print(line.strip())

.split()

numbers = “1. 2. 3. 4. 5”
print(numbers.split(“.”)) -> [‘1’, ‘ 2’, ‘ 3’, ‘ 4’, ‘ 5’]

특정 문자를 기준으로 분리시킨다.
파라미터를 넣어 주지 않으면 split() 화이트 스페이스를 기준으로 한다.

리스트의 값들은 항상 문자열로 나온다.

파일 쓰기

with open('파일이름', 'w') as f:
    f.write("내용입력")
    f.write("내용입력")

현재 위치한 폴더에 생성된다.
기존의 파일을 수정하면 덮어씌워 진다.

기존의 파일에 추가를 하려면

with open('파일이름', 'a') as f:
    f.write("내용입력")
    f.write("내용입력")

해당 이름의 파일이 있으면 기존의 내용 뒤에 추가가 된다.
해당 이름의 파일이 없으면 새로 만든다.

ternary expression

condition = True

condition_str = "nice" if condition else "not nice"

print(condition_str)

condition이 참일 때는 nice가 되고 거짓일 때는 not nice가 된다.
if else문을 간략하게 나타낼 수 있다.

list comprehention

list = [1, 2, 3, 4, 5]
squares = []

for x in list:
    squares.append(x ** 2)

print(squares)
list = [1, 2, 3, 4, 5]
squares = [x ** 2 for x in list]

print(squares)

새로운 리스트를 간단하게 만드는 방법이다.

Leave a comment