📔파워 유저를 위한 파이썬 Express 06. 파이썬 자료구조 1(리스트)
Zip()함수
동시에 두 개 이상의 리스트를 반복하기 위해 zip()함수를 사용할 수 있다.
zip()함수는 2개의 리스트를 받아서 항목 2개 출력
점(.)
파이썬에서 모든 것은 객체(object)
객체는 관련되는 변수와 함수를 묶은 것
파이썬에서 리스트도 객체
객체 안에 있는 함수를 사용할 때는 객체의 이름을 쓰고 점(.)을 붙인 후에 함수의 이름을 적음
리스트 탐색하기
만약 값이 리스트에서 한 번 이상 등장한다면 탐색을 시작하는 위치를 index()함수로 넘길 수 있음
heroes=["아이언맨","토르","헐크","스칼렛위치","헐크"]
n=heroes.index("헐크",3) #n은 4가 된다
index("헐크", 3)은 인덱스 3부터 "헐크"를 찾음
요소 삭제하기
🔑항목이 저장된 위치를 알고 있다면 pop(i)를 사용
heroes=["아이언맨", "토르", "헐크"]
h=heroes.pop(1) #h는 '토르'
🔑항목의 값만 알고 있다면 remove(value)를 사용
heroes=["아이언맨","토르","헐크"]
heroes.remove("토르")
역순으로 리스트 정렬하기
키워드 인수인 reverse를 True로 설정하기
a=[3,2,1,5,4]
a.sort(reverse=True) #[5,4,3,2,1]
정렬 #2
sorted(): 크기순으로 정렬된 새로운 리스트를 반환
원래의 리스트는 수정되지 않음
numbers=[10,3,7,1,9,4,2,8,5,6]
ascending_numbers=sorted(numbers)
print(ascending_numbers)
리스트에서 사용할 수 있는 내장 함수
함수 | 설명 |
round() | 주어진 자리수대로 반올림한 값을 반환 |
reduce() | 특정한 함수를 리스트 안의 모든 요소에 적용하여 결과값을 저장하고 최종 합계만을 반환 |
sum() | 합 |
ord() | 유니코드 문자의 코드값 반환 |
cmp() | 첫 번째 리스트가 두 번째보다 크면 1을 반환 |
max() | 최댓값 |
min() | 최솟값 |
all() | 리스트 안의 모든 요소가 참이면 참을 반환 |
any() | 리스트 안의 한 요소라도 참이면 참을 반환 |
len() | 리스트의 길이 반환 |
enumerate() | 리스트의 요소들을 하나씩 반환하는 객체 생성 |
accumulate() | 특정한 함수를 리스트의 요소에 적용한 결과를 저장하는 리스트 반환 |
filter() | 리스트의 각 요소가 참인지 아닌지를 검사 |
리스트에서 랜덤으로 선택하기
choice()
import random
numberList=[1,2,3,4,5,6,7,8,9,10]
print("랜덤하게 선택한 항목=", random.choice(numberList))
리스트 복사하기
temps=[28, 31,33, 35,27, 26, 25]
values=temps
리스트는 복사 안 됨. temps와 values는 동일한 리스트를 가리킴-> 🍋얕은 복사(Shallow Copy)
만약 values를 통하여 리스트 요소의 값을 변경한다면 temps 리스트도 변경됨
temps=[28, 31,33,35,27,26,25]
vaues=temps
print(temps) #temps리스트 출력
values[3]=39 #values 리스트 변경
print(temps) #temps리스트 변경됨
🍋깊은 복사(deep copy): 리스트를 올바르게 복사하는 방법
🔑list()사용
list(): 다른 리스트나 데이터들을 받아서 새로운 리스트를 생성하는 생성자 함수
temps=[28, 31,33, 35,27, 26, 25]
vaues=list(temps)
🔑슬라이싱 [:] 사용
new_numbers=numbers[:]
리스트와 함수
🍋값으로 호출하기(Call-by-Value): 함수로 변수를 전달할 때, 변수의 복사본이 함수로 전달되는 방법
🍋참조로 호출하기(Call-by-Reference): 함수로 변수를 전달할 때, 변수의 참조가 전달되는 방법. 함수에서 매개 변수를 통하여 원본 변수를 변경할 수 있음
파이썬에서는 정수나 문자열처럼 변경이 불가능한 객체들은 "값으로 호출하기" 방법으로 전달됨
개체의 참조값이 함수의 매개 변수로 전달되지만 함수 안에서 객체의 값을 변경하면 새로운 객체가 생성되기 때문
🔑불변 객체는 값이 변경되면 새로 생성됨
참조로 호출되는 경우: 리스트
변경 가능한 객체인 리스트를 함수에 전달하면 참조값으로 전달됨
def func2(list):
list[0]=99
values=[0,1,1,2,3,5,8]
func2(values)
print(values)
원본 리스트 값도 변경됨
리스트 함축(list comprehensions)
comprehension: 함축, 포함, 내포
형식: [수식 for (변수 in 리스트) if (조건)]
예: squares=[x*x for x in range(10)]
-squares: 새로운 리스트
-x*x: 출력식으로 새로운 리스트의 요소가 됨
-x: 입력 리스트에 있는 요소 x에 대하여
-range(10): 입력 리스트
리스트 함축 사용하지 않는 경우: 반복문 사용
squares=[]
for x in range(10):
squares.append(x*x)
조건 추가하는 경우
squares=[x*x fo x in range(10) if x%2==0]
리스트 내포에서 if문이 for문 앞에 오는 경우는 조건식을 적용한 결과를 리스트에 저장하고 싶을 때입니다. 즉, if문이 참인 원소들만 새로운 리스트에 넣고 싶을 때 사용합니다.
예를 들어, prices에서 0보다 큰 원소들만 추출하고 싶다면 다음과 같이 코드를 작성할 수 있습니다.
prices=[13,-545,922,356,-992,217]
mprices=[i for i in prices if i>0]
mprices
이 코드는 prices의 각 원소에 대해 if i>0이라는 조건식을 검사하고, 참인 경우에만 i를 mprices에 추가합니다. 따라서 mprices는 [13, 922, 356, 217]이라는 리스트가 됩니다.
반면에 리스트 내포에서 if문이 for문 뒤에 오는 경우는 조건식에 따라 원소의 값을 바꾸고 싶을 때입니다. 즉, if-else문을 사용하여 원소의 값을 변환하고 싶을 때 사용합니다.
예를 들어, prices에서 0보다 큰 원소들은 그대로 두고, 0보다 작은 원소들은 0으로 바꾸고 싶다면 다음과 같이 코드를 작성할 수 있습니다.
prices=[13,-545,922,356,-992,217]
mprices=[i if i>0 else 0 for i in prices]
mprices
이 코드는 prices의 각 원소에 대해 i if i>0 else 0이라는 조건식을 적용하고, 그 결과를 mprices에 저장합니다. 따라서 mprices는 [13, 0, 922, 356, 0, 217]이라는 리스트가 됩니다.
2차원 리스트를 함수로 넘기기
2차원 리스트를 s라고 하면 len(s)는 행의 개수이고 len(s[0])는 열의 개수이다.
len(s[0])는 첫 번째 행의 길이지만, 어차피 모든 행의 기이가 같기 때문에 2차원 리스트의 열의 개수로 사용할 수 있다.