프로그래밍 언어/Python

[Python] Collection - List

eunnys 2023. 10. 29. 18:58

1. List

List 특징

  • 배열과 같은 자료(시퀀스 구조, 즉 순서가 있다), 수정 가능하다, 가변적이다.
  • 리스트의 요소는 일반적으로 같은 타입이지만 다른 타입을 썩어서 저장하는 것도 가능하다 (일반적이지는 않음)
  • 첨자로 음수 가능
  • + 연산자를 이용하면 두 개의 서로 다른 리스트를 붙일 수 있다.
  • [] 또는 list()를 이용해 생성

 

 

List slicing

 

- 문자열과 동일하게 슬라이싱 가능

 

 

Deep Copy

 

- [:] 또는 copy 모듈의 deepcopy() 함수를 이용하여 깊은복사 가능

 

 

List 연산

 

+ : 리스트 연결

* : 리스트 반복

 

 

List 관련 함수

 

함수명 설명
append() 리스트의 뒤에 데이터 추가하기
sort() 리스트를 정렬
역순으로 정렬하기 위해서는 reverse=True 옵션 
reverse() 리스트 요소 순서를 뒤집는다
index() 특정 요소의 위치 값 반환
insert(위치, 데이터) 지정된 위치에 데이터를 삽입한다
pop() 마지막 요소 리턴 후 삭제
count(요소값) 특정 요소의 개수 세기
extend(리스트) 원래의 리스트를 매개변수로 전달한 리스트와 합쳐서 확정
len(리스트) 리스트 요소의 개수를 구함

 

a = []
b = list()
c = [1,2,3]

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

# 얕은 복사
b = a    # a와 b는 같은 참조값을 갖게 된다
print(b)
a[2] = 20
print(b) # a를 바꿨지만 b도 바뀜 (서로의 변화에 영향을 미침)

print('-'*20) # 경계선
# 깊은 복사
c = a[:]
print(c)
print(a is b)  # 동일한 참조값
print(a is c)  # 서로 다른 참조값

print('-'*20)
# 리스트 요소 삭제
a[1:3] = []  # 비어있는 값을 집어넣으면 삭제
print(a)
a = [1, 5, 3, 6, 7]
# a.sort()  # 오름차순 정렬
a.sort(reverse=True) # 내림차순 정력
print(a)
a = [1, 4, 5, 5, 11, 10, 87, 34, 5]
# 다음 함수는 리스트 객체의 함수가 아닌 파이썬의 내장 함수
print(len(a)) # 원소의 갯수
print(max(a)) # 최대값
print(min(a)) # 최소값
print(sum(a)) # 합계
print(sum(a) / len(a)) # 평균
# 이중 리스트
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(l)
print(l[0])
print(l[1][0])

for x in l:
    for y in x:
        print(y, end=' ')
    print() # 두번째 리스트를 출력할 때 개행
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1, 2, 3]
4
1 2 3 
4 5 6 
7 8 9

import copy # 외국 모듈을 불러올 때 사용

matrix = [[1, 2, 3],
         [4, 5, 6],
         [7, 8, 9]]
# [:]를 이용한 깊은 복사는 서브 리스트까지 깊은 복사를 수행하지 않는다.
# copy_m = matrix[:]

# 반면 deepcopy함수는 모든 요소에 대한 깊은 복사를 수행한다.
copy_m = copy.deepcopy(matrix)
print(id(matrix))
print(id(copy_m))
print('-'*20)
print(id(matrix[0]))
print(id(copy_m[0]))

 

 

 

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

score = [[88, 76, 92, 98],
        [65, 70, 58, 82],
        [82, 80, 78, 88]]
result = 0
for x in score:
    s = 0
    for y in x:
        s += y
    print('총점: ', s, '\t', '평균: ', s/4)
    result += s/4 
print('전체 평균: ', result/3)
score = [[88, 76, 92, 98],
        [65, 70, 58, 82],
        [82, 80, 78, 88]]
total = 0  # 모든 학생의 총점을 저장
all_subject = 0  # 전체 과목 수를 저장
index = 0 # 학생 번호 지정
for student in score:
    index += 1
    print(f'{index}번 학생 총점: {sum(student)}, 평균: {sum(student)/len(student):.2f}') # 소수점 이하 2자리까지만
    total += sum(student)
    all_subject += len(student)
print(f'전체 평균: {total / all_subject:.2f}')
1번 학생 총점: 354, 평균: 88.50
2번 학생 총점: 275, 평균: 68.75
3번 학생 총점: 328, 평균: 82.00
전체 평균: 79.75

 

 

 

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

 

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

year = int(input('년도를 입력하세요: '))
month = int(input('월을 입력하세요: '))
result = '윤년' if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else '평년'
if month in [4, 6, 9, 11]:
    print(f'{year}년 {month}월은 30일까지 있습니다.')
elif result == '윤년' and month == 2:
    print(f'{year}년 {month}월은 29일까지 있습니다.')
elif result == '평년' and month == 2:
    print(f'{year}년 {month}월은 28일까지 있습니다.')
else:
    print(f'{year}년 {month}월은 31일까지 있습니다.')
년도를 입력하세요:  2020
월을 입력하세요:  2

2020년 2월은 29일까지 있습니다.

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:
    max_date = 29 if (year % 4 == 0 and year % 100 != 0) or year % 400 == 0 else 28
else:
    max_date = daysInMonth[month-1]
print(f'{year}년 {month}월은 {max_date}일까지 있습니다.')
년도를 입력하세요:  2023
월을 입력하세요:  2

2023년 2월은 28일까지 있습니다.