카테고리 없음

[네이버 부스트코스] 프로그래밍 기초(ft. 파이썬) 6차시: 시퀀스(리스트, 튜플, 문자열)

닉네임이 멋이 중헌디 2021. 2. 5. 20:06

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]로 정렬합니다.

 

 

 

 

소수 구하기