본문 바로가기
국비 교육/파이썬

[파이썬] List

by 육츠 2023. 11. 4.
Contents 접기

List

- 배열과 같은 자료(시퀀스 구조 = 순서가 있다), 수정가능하다, 가변적이다
- ' + ' 연산자를 이용하면 두 개의 서로 다른 리스트를 붙일 수 있다.
- [] 나 list() 를 이용해 생성한다.
- List slicing : 문자열과 동일하게 슬라이싱 가능하다.

 

Deep Copy 깊은 복사

[:] 또는 copy 모듈의 deepcopy() 함수를 이용하여 깊은 복사 가능.(원본에 대한 복사본 -> 값을 변경해도 원본의 영향을 주지 않는다.)
<-> 얕은 복사 : 같은 값을 가진 리스트 생성 시 값을 변경하면 원본의 영향을 준다.

# 비어있는 리스트 생성
# 비어있는 리스트 생성
a = []
b = list()

c = [1,2,3]

# 슬라이싱
a = [1,2,3,4,5,6,7]
print(a[:2])
print(a[2:])

# 얕은 복사
# 원본 데이터와 동일한 주소값을 가지기 때문에
# a, b 는 같은 참조값을 갖게 된다
b = a
print(b) # [1, 2, 3, 4, 5, 6, 7]
a[2] = 20
print(b) # [1, 2, 20, 4, 5, 6, 7]

print('-'*20)

#깊은 복사
# 서로 다른 참조값을 갖게 된다.

c = a[:]
print(c) 
# [1, 2, 20, 4, 5, 6, 7]

print(a is b) # True
print(a is c) # False

print('-'*20)
# 리스트 요소 삭제
a[1:3] = [] 
# 슬라이싱을 사용하여 비어있는 값 대입
print(a)

 

List 관련 함수

a = [1,5,3,6,7]
# a.sort()
a.sort(reverse=True)
print(a) # [7, 6, 5, 3, 1]
# print(a.sort()) # sort는 출력값 없음

# for문을 통해 값을 꺼내 비교한다.
ans = input("결제를 하시겠습니까? ")
if ans in ["yes","y","ok","네","예"]:
    print("구매해 주셔서 감사합니다")
else:a
    print("안녕히 가세요!")

이중 리스트 : 리스트의 요소로 리스트를 갖는 형태

l = [[1,2,3],[4,5,6],[7,8,9]]
print(l) # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(l[0]) # [[1, 2, 3]
print(l[1][0]) # 4

for x in l:
    # print() :  윗 줄 공백
    for y in x:
        print(y, end=' ')
    print() # : 아랫줄 공백
# 1 2 3 
# 4 5 6 
# 7 8 9

 

[문제] 성적 총점과 평균 구하기
학생 3 명의 성적에 대해 각각 총점과 평균을 구하고, 전체 평균을 구하세요.

score = [[88, 76, 92,98],
        [65, 70, 58, 82],
        [82, 80, 78, 88]]

# 내가 적은 코드
for x in score:
    print(x)
    print(sum(x))
    print(sum(x)/len(x))
# [88, 76, 92, 98]
# 354
# 88.5
...

# 교수님 코드
total = 0  # 전체 모든 학생의 총점을 저장
all_subjects = 0 # 전체 과목 수
index = 0

for student in score:
    index += 1
    print(f'{index}번 학생: 총점: {sum(student)}, 평균: {sum(student)/len(student):.2f}')
    total += sum(student)
    all_subjects += len(student)

print(f'전체 평균: {total / all_subjects:.2f}')

# 1번 학생: 총점: 354, 평균: 88.50
# 2번 학생: 총점: 275, 평균: 68.75
# 3번 학생: 총점: 328, 평균: 82.00
# 전체 평균: 79.75

내가 적은 코드는 리스트를 뽑아 리스트에 맞춰 합산과 평균을 계산 했지만 전체 평균을 구하기에는 어려워 다른 코드를 구상했어야 할 것 같다.

 

[문제] 일 수 구하기

- 1~12월 중 입력 받은 월이 몇 일까지 있는지를 계산하는 프로그램을 작성하세요.
- 단, 윤년의 2월인 경우에는 최대 일수를 29일로 출력한다.

[실행 예시]
년도를 입력하세요: 2023
월을 입력하세요: 10
2023년 10월은 31일까지 있습니다.

# 이 날은 교육 중간에 상담이 있어 수업을 못들었다.

daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]
year = int(input('년도를 입력하세요: '))
month = int(input('월을 입력하세요: '))
max_date = 0
if month == 2: # 2월에서 윤년 체크한다.
    max_date = 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28
else:
    max_date = daysInMonth[month-1] # 적은 월 -1 = 인덱스의 위치이다.
print(f'{year}년 {month}월은 {max_date}일까지 있습니다.')

# 년도를 입력하세요:  2020
# 월을 입력하세요:  2
# 2020년 2월은 29일까지 있습니다.