1. 리스트 활용법
2. 리스트, 문자열, 튜플
3. 리스트 활용 예제: 정렬과 소수 구하기
리스트
리스트는 여러 값들을 대괄호 안에 나열해서 적는 방법으로 만들 수 있습니다.
리스트는 list 타입의 객체입니다.
리스트의 각 원소는 위치 값을 사용해서 접근할 수 있습니다. [인덱싱]
첫 번째 원소는 0번째 위치에, 두 번째 원소는 1번째 위치에 있습니다.
음수 위치를 사용하면 리스트의 끝에서부터 접근할 수 있습니다.
리스트의 길이는 len을 사용해서 구할 수 있습니다.
빈 리스트는 [ ] 로 표기할 수 있습니다. 빈 리스트의 길이는 0입니다.
하나의 리스트는 여러 다른 종류의 객체를 담을 수도 있습니다.
튜플을 담을 수도 있습니다.
리스트과 관련된 내장 함수들
len은 리스트의 길이를 반환합니다.
sum은 리스트의 각 원소의 합을 반환합니다.
max는 리스트에서 가장 큰 원소를, min은 가장 작은 원소를 반환합니다.
리스트는 가변 객체이다
다음 리스트는 비활성기체의 이름을 담은 리스트입니다.
원소를 바꾸는 방법:
원소를 끝에 추가하는 방법:
Aliasing
다시 보기: 하나의 객체는 여러 이름을 가질 수 있습니다.
이를 Aliasing이라 부릅니다.
가변 객체를 사용할 때는 객체가 잘못 바뀌지 않도록 조심해서 사용해야 합니다.
이때 같은 값을 넣는 거지
=> list2 = list1하면 list1이라는 값을 주는 것
그러므로 둘은 같은 객체에 대한 다른 이름. ex. 같은 사과를 보고 한국인은 '사과', 미국인은 'apple'/ 하지만 누군가 그 사과의 반을 먹는다면 '사과'도 'apple'도 반이 남는다.
=> 반면 객체의 형태는 같지만 각각 객체를 정의해준 list1,list2는 다르다
크기, 색 등이 같은 사과 2개 중 하나를 list1, 다른 하나를 list2로 정의한 것.
그러므로 list1을 먹으면 list2에 영향을 주지 않고 반대의 경우도 마찬가지다.
다시 보기: 여러 이름을 가진 객체
=> 이 경우 yellow로봇이라는 같은 객체에 다른 이름 ami, hubo가 있었지만
hubo에게 blue로봇이라는 새로운 객체를 준 순간 ami와 hubo는 각각 다른 객체를 가리키게 된다.
리스트 탐색하기
반복문을 이용해 리스트의 각 원소를 탐색할 수 있습니다.
for country in countries: => 리스트의 모든 원소를 뽑는(아마 순서는 따로 없다)
print(country)
함수 range는 range 타입의 객체를 만들어주는 함수입니다.
=> range는 주어진 인자에 대한 범위를 0~(인자-1)까지 준다
만약 (a,b)의 형태로 인자를 준다면 a~(b-1)까지 준다
그러므로 인자에는 반드시 리스트를 의미하는 변수가 아니라 리스트의 길이 즉 정수를 주어야 한다
이를 위해서는 len(리스트를 의미하는 변수)을 range()의 인자로 넣어주면 된다.
리스트의 원소 값을 바꾸고 싶다면, 그 원소의 위치를 알아야 합니다.
=> 리스트를 변경하고 싶으면 a = a +1처럼 같은 변수 반복을 통해 오른쪽 값을 왼쪽 변수에 넣을 수 있다.
나라별 총 메달 수를 출력해봅시다.
위에서 구한 값을 저장하는 새로운 리스트를 만들 수 있습니다.
새로 만든 totals 리스트는 튜플 (medals, country) 의 리스트입니다.
#2. 리스트, 문자열, 튜플
정렬
리스트는 sort 함수를 이용해 원소들을 정렬할 수 있습니다.
=> 알파벳 순서대로
=> 오름차순으로
totals 리스트를 정렬해봅시다.
=> 원소들이 튜플이고 원소마다 여러개가 있으면 앞에 있는 원소 기준으로 오름차순
=> 내림차순은 변수.sort()한 뒤 변수.reverse()
리스트 자르기
리스트의 특정 부분을 잘라내서 새로운 리스트로 만들 수 있습니다 (slicing)
sublist = mylist[i:j]
sublist는 mylist의 인덱스 i,i+1,…,j-1에 해당하는 원소를 포함한 리스트입니다.
i 를 생략하면,([:j]) sublist는 mylist의 첫 번째 원소부터 가지게 됩니다.
j 를 생략하면,([i:])sublist는 mylist의 마지막 원소까지 가지게 됩니다.
다음처럼 쓰면 리스트를 복사할 수 있습니다.
list2 = list1[:]
=> 복사하는 것. 그러므로 aliasing이 아니라 새로운 리스트
리스트 뒤집기
다음처럼 리스트를 뒤집어, 메달이 많은 나라가 앞쪽에 오게 할 수 있습니다.
메달이 가장 많은 10개의 나라만 따로 볼 수도 있습니다.
리스트의 원소는 다음처럼 풀어낼 수 있습니다.
메달 순위
메달 수 상위 10개의 나라를 메달수에 관해 정렬해봅시다.
table = []
for i in range(len(countries)):
table.append( (gold[i], silver[i], bronze[i], countries[i]) )
table.sort()
top_ten = table[-10:]
top_ten.reverse()
for g, s, b, country in top_ten:
print(country, g, s, b)
한 종류의 메달만 획득한 나라
한 종류의 메달만 획득한 나라들을 모두 찾아봅시다.
(메달을 하나도 획득하지 못한 나라는 없다고 가정합니다)
def no_medals(countries, al, bl): => al, bl 는 메달1, 메달2(종류 상관 없이 순서대로 1,2부여)
result = []
for i in range(len(countries)):
if al[i] == 0 and bl[i] == 0: => 세개의 자리 중 2개가 공석. 그러므로 한 종류의 메달만 획득.
result.append(countries[i])
return result
only_gold = no_medals(countries, silver, bronze)
only_silver = no_medals(countries, gold, bronze)
only_bronze = no_medals(countries, gold, silver)
only_one = only_gold + only_silver + only_bronze
리스트의 멤버 함수
리스트 객체 L은 다음과 같은 멤버 함수들을 가지고 있습니다.
* L.append(v) v 객체를 리스트 끝에 추가
* L.insert(i, v) 객체를 리스트의 i번째 위치에 추가
* L.pop() 리스트의 마지막 원소를 삭제하고, 그 값을 반환
* L.pop(i) i번째 원소를 삭제하고, 그 값을 반환
* L.remove(v) v와 일치하는 첫 번째 원소를 삭제
* L.index(v) v와 일치하는 첫 번째 원소의 위치를 반환
* L.count(v) v와 일치하는 원소들의 개수를 반환
* L.extend(K) K의 모든 원소를 리스트 L 끝에 추가
* L.reverse() 리스트의 모든 원소를 역순으로 재배열
* L.sort() 리스트 정렬
다음 두 코드는 어떤 차이가 있을까요?
L.append(13)
L + [13]
시퀀스
리스트는 시퀀스(Sequence)의 한 종류입니다.
문자열과 튜플 또한 시퀀스의 한 종류입니다.
=> 시퀀스는 인덱싱, 슬라이싱 가능. for반복문을 이용해 원소 나열 가능
리스트, 튜플, 문자열
리스트과 튜플은 비슷하지만 큰 차이점이 있습니다.
리스트는 가변 객체지만, 튜플(과 문자열)은 불변 객체입니다.
시퀀스는 list, tuple 함수를 이용해 리스트이나 튜플로 만들 수 있습니다.
메달 리스트
Python에서는 올림픽 메달 집계 정보를 (나라, 금,은,동)리스트 4개로 만드는 것보다, (나라별 금은동 메달 )튜플들의 리스트로
만드는 방법을 더 많이 사용합니다.
나라별 총 메달 수는 다음처럼 출력할 수 있습니다.
def print_totals1():
for country, g, s, b in medals:
print(country + ":", g + s + b)
def print_totals2():
for item in medals:
print(item[0] + ":", sum(item[1:]))
히스토그램
메달 집계 결과로 히스토그램을 만들어 봅시다.
def histogram():
t = [0] * 13 => [0,0,0,......0]
for item in medals:
total = sum(item[1:]) => 나라별 총 메달 수
t[total // 3] += 1 => 총 메달 수를 3으로 나눈 몫(3씩 한칸으로 지정하기 위해)대로
[0,0,0,....0]에서 인덱싱해서 하나씩 더함
for i in range(13):
print (str(3*i) + "~" + str(3*i+2)+":\t"+("*"* t[i]))
=> 범위 : 0~2 =>t 리스트에서 개수 인덱싱해서 *과 곱합
#3.리스트 활용 예제: 정렬과 소수 구하기
버블 정렬
Sort 시각화 참고 : https://visualgo.net/en/sorting
# 리스트 a의 원소들을 크기 순으로 정렬
def bubbleSort(a):
sorted = False
while(not sorted):
sorted = True => 그러므로 while문 계속
for i in range(1,len(a)):
if (a[i-1] > a[i]):
a[i-1],a[i]=a[i],a[i-1] => 리스트 중 앞이 더 크면 뒤와 바꾼다
sorted = False => i가 len(a)까지 돌고 for문에서 나오면 sorted=True가 되어
not sorted=False가 되어 while문이 멈춘다
예) bubbleSort는 [5,1,4,2,8]을 [1,2,4,5,8]로 정렬합니다.
소수 구하기