Python: List[ ] 외

cdspacenoob·2022년 6월 29일
0

압축 Python

목록 보기
1/12
post-thumbnail

Data를 집합으로 다룬다는 것

  • 그 크기를 파악할 수 있다
  • 정렬이 가능하다
  • 생성 / 전체 또는 조건 조회 / 수정 / 삭제를 자유롭게 한다
  • 여러 개의 data를 return 하거나 변수로 사용할 수 있다

이러한 기능들을 통해 데이터를 핸들링 하는 것이 목표다.


List = [ ]


List를 공부하는 요령

  • List는 반복문과 함께 연습
  • 다른 자료형과 무엇이 다른지 파악
  • 그 차이점에서 나오는 특징과 메서드 정리
  • '데이터를 집합으로 다룬다'의 의미를 알기

문자열은 str형으로 체크되지만 내부적으로는 List로 다루어진다.
따라서 인덱스를 통해 각 요소에 접근 가능하다.

a = "hello"
type(a)
>> class 'str'

print(a[0])
>> 'h'

List는 iterable 객체다

iterable 객체란? - 반복 가능한 객체
- 내부 요소에 순서대로 접근할 수 있는 객체 따라서 반목문(for, while)을 통한 제어가 많다.

List는 서로 다른 자료형도 함께 보관한다

  • 문자열, 숫자, 리스트 내의 리스트 등을 동시에 요소로 가질 수 있다


주요 메서드

요소 접근 연산자: [ ]

a = ['a', 'b', "cat"]

print(a[2])
>> cat

print(a[2][1]
>> c

연결 / 반복 / 길이

a = [1, 2, 3]
b = [4, 5, 6]

print(a+b)
>> [1, 2, 3, 4, 5, 6]

print(a * 2)
>> [1, 2, 3, 1, 2, 3]

print(len(a))
>> 3

요소추가: append() / insert()

  • 리스트이름.append(추가할 요소)
  • 리스트이름.insert(인덱스, 추가할 요소)

얘들은 '한 개'의 요소만 추가한다.
단, 여기서의 요소는 문자열, List 그 자체 등을 포함한다.

a = []

print(a)
>> 

a.append('apple')
print(a)
>> ['apple']

a.insert('banana')
print(a)
>> ['banana', 'apple']
# 이미 요소가 존재하는 인덱스에 insert를 하면 
# 기존의 자료는 한 칸 오른쪽으로 밀려난다

요소 추가: extend()

리스트이름.extend(추가할 요소: List 또는 문자열)
연결 연산자와 비슷한 형태로 동작하지만 하나의 차이점이 있다.
연결 연산자'+'는 자기 자신을 연산의 대상으로 하지 않는 이상 기존 자료에 영향을 주지 않는다.
extend()는 직접 기존 자료에 영향을 준다

a = [1, 2, 3]
b = [4, 5, 6]

print(a + b) 
>> [1, 2, 3, 4, 5, 6]
print(a)
print(b)
>> [1, 2, 3]
>> [4, 5, 6]

a.extend(b)
print(a)
>> [1, 2, 3, 4, 5, 6]
참고: 성능 항상을 위하여 - Append() vs. 연산자 '+' 연산자`'+'`는 말 그대로 리스트와 또 하나의 List를 더하는 것이다 `append()`는 이미 존재하는 List에 값만 추가하는 것이다

List에 하나의 항목만 추가할 때는 append()를 사용한다
List끼리 이어야 할 경우(concatenation)에는 연산자'+' 또는 extend()를 사용한다

⚙︎ Python list의 +=와 append의 성능 분석 (보너스: +=와 extend 성능 분석)


요소 제거: 인덱스로 제거

  1. del
    del 리스트이름[인덱스]

  2. pop()
    리스트이름.pop[인덱스]


요소 제거: 값으로 제거

  • remove( )
    리스트이름.remove()

요소제거: List 비우기(모든 요소 제거)

  • clear( )
    리스트이름.clear( )

List 정렬

  • sort( )
    리스트이름.sort( )

    기본은 오름차순
    내림차순: 리스트이름.sort(reverse = True)


List 내부에 존재 유무 판단: in / not in

  • in 리스트이름
    True 또는 False가 반환된다
a = [1, 2, 3]
b = 4 not in a
print(b)
>> True

중첩 List

2차원 테이블의 효율성은 이미 오랜 기간을 거쳐 입증되었으며
이를 Python에서 표현하는 것이 중첩 List라 할 수 있다. (다차원 List)

중첩 List는 매우매우 중요하다

웬만하면

  • 자료형이 같은 데이터를 함께 다룬다 (달라도 괜찮지만)
  • 외부 List의 element 개수와 내부 List의 element 개수가 같도록 맞춰준다

numpy와 pandas를 이용한 data handling 기법이 사용된다.

참고: 전개 연산자란? 애스터리스크(*)를 붙여줌으로써 여러 개의 값을 가져올 수 있다

반복문과 List를 활용한 예제코드

  • 달력

# 함수: 달력 만들기

def cal(year, month):

    blank = [6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4]
    last_date = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

    print(f"\t\t\t {year}{month}월")
    print("일 \t월 \t화 \t수 \t목 \t금 \t토")

    for _ in range(blank[month-1]):
        print("\t", end='')
        
    for i in range(1, last_date[month-1]+1):
        print(f"{i}\t", end='')
        if(i+blank[month-1])%7==0:
            print("\n")
            
    print("\n\n")
        
cal(2022, 6)

>>
			 20226월
일 	월 	화 	수 	목 	금 	토
			1	2	3	4	

5	6	7	8	9	10	11	

12	13	14	15	16	17	18	

19	20	21	22	23	24	25	

26	27	28	29	30

  • 임의의 숫자공이 담긴 바구니
# 임의의 숫자공이 담긴 바구니 만들기

bowl = []
while True:
    # 임의의 숫자 하나를 ball에 받는다
    ball = random.randrange(1, 100+1)
    
    # ball이 중복되지 않도록 이미 bowl 안에 있는지 검사한다
    # ball이 bowl 안에 없다면 append
    if ball not in bowl:
        bowl.append(ball)

    # bowl 안의 ball 개수가 45개가 되면 수집 종료
    if len(bowl) == 45:
        break

bowl.sort()
print(bowl)
>>
...

  • 윤년 / 평년
# 윤년
# 1. 400으로 나누어떨어진다
# 2. 4로 나누어떨어지고 100으로 나누어 떨이지지 않아야 한다
    
    
def is_leap_year(year):
    year = int(year)
    if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
        print(f"{year}년도는 윤년입니다")
    else:
        print(f"{year}년도는 평년입니다")
        
        
def get_feb_lastday(year):
    year = int(year)
    if (year % 400 == 0) or (year % 4 == 0 and year % 100 != 0):
        lastday = 29
    else:
        lastday = 28
    return lastday

    
a = get_feb_lastday(2022)
print(a)
    
    
for i in range(2000, 2022+1):
    is_leap_year(i)

>>
...

오늘의 커스텀 코드

1. while( ) 함수로 나무 베기

# while() 함수 활용
def bearbear():
    while True:
        try:
            number_tree = int(input("우리는 몇 그루의 나무를 베어야 할까요?\n"))
            if number_tree == 0:
                print("0보다는 큰 수를 입력하셔야 해요")
                return bearbear()
            print("오케이 "+str(number_tree)+" 그루의 나무를 베어 볼게요")

            break
        except ValueError:
            print("숫자만 입력하셔야 해요")


    while True:
        try:
            number_slice = int(input("몇 번씩 찍어야 넘어갈까요?\n"))
            print("알겠어요 "+str(number_slice)+"번씩 도끼질 해볼게요\n")
            break
        except ValueError:
            print("여기도 숫자만 입력하셔야 해요")


    for i in range (1, number_tree+1):
        print("<", i, "번째 나무 베는 중 >")
        for j in range(1, number_slice+1):
            print(j,"번째 도끼질하는 중 ")
        print()
    print("나무 베기 끝!")

bearbear()

>>
우리는 몇 그루의 나무를 베어야 할까요?
3
오케이 3 그루의 나무를 베어 볼게요
몇 번씩 찍어야 넘어갈까요?
5
알겠어요 5번씩 도끼질 해볼게요

< 1 번째 나무 베는 중 >
1 번째 도끼질하는 중 
2 번째 도끼질하는 중 
3 번째 도끼질하는 중 
4 번째 도끼질하는 중 
5 번째 도끼질하는 중 

< 2 번째 나무 베는 중 >
1 번째 도끼질하는 중 
2 번째 도끼질하는 중 
3 번째 도끼질하는 중 
4 번째 도끼질하는 중 
5 번째 도끼질하는 중 

< 3 번째 나무 베는 중 >
1 번째 도끼질하는 중 
2 번째 도끼질하는 중 
3 번째 도끼질하는 중 
4 번째 도끼질하는 중 
5 번째 도끼질하는 중 

나무 베기 끝!


2. 재귀함수를 사용한 오늘의 운 시험해보기

import random
import time

# picked_number: 내가 선택할 숫자
# start_number / end_number: 운을 시험해볼 숫자 범위(시작, 끝)
def random_game(picked_number, start_number, end_number):
    random_number = random.randrange(start_number, end_number+1)
    if random_number == picked_number :
        print("당첨!")
        return "당첨"
    else:
        print("다시!... 2초후에...")
        time.sleep(2)
        random_game(picked_number, start_number, end_number+1)
        
        
random_game(3, 1, 10)
profile
can do this all day

0개의 댓글