[python] 리스트(List)
🚀 리스트(List)
- 리스트에 소속되는 각각의 값을 요소(Element) 또는 원소라고 함
- 문자열(변경 불가능)과는 달리 요소 변경 및 대체 가능
💡 리스트 요소 대체(replace)
nums = list(range(10)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
nums[2:5] = [20, 30, 40]
print(nums)
nums[6:8] = [90, 91, 92, 93, 94] # 개수 다른 경우도 대체 가능
print(nums)
[0, 1, 20, 30, 40, 5, 6, 7, 8, 9]
[0, 1, 20, 30, 40, 5, 90, 91, 92, 93, 94, 8, 9]
💡 리스트 요소 삭제
nums = list(range(10))
nums[2:5] = [] # 값을 빈 리스트[]로 대체시 삭제 효과
print(nums)
del nums[4] # 요소 한 개 삭제
print(nums)
[0, 1, 5, 6, 7, 8, 9]
[0, 1, 5, 6, 8, 9]
💡 리스트 요소 연결(concat)
list1 = [1, 2, 3, 4, 5]
list2 = [10, 11]
listadd = list1 + list2
print(listadd)
listmulti = list2 * 3
print(listmulti)
[1, 2, 3, 4, 5, 10, 11]
[10, 11, 10, 11, 10, 11]
🚀 2차원 리스트
연습) 학생 성적처리
각 학생의 총점, 평균과 전체 학생의 평균 구하기
score = [
[88, 76, 92, 98],
[65, 70, 58, 82],
[82, 80, 78, 88]
]
total = 0
totalsub = 0
for student in score:
sum_ = 0
for subject in student:
sum_ += subject
subjects = len(student)
print("총점 %4d, 평균 %6.2f" % (sum_, sum_/subjects))
total += sum_
totalsub += subjects
print("\n전체평균 %.2f" % (total/totalsub))
총점 354, 평균 88.50
총점 275, 평균 68.75
총점 328, 평균 82.00
전체평균 79.75
🚀 List Comprehension
[수식 for 변수 in 리스트 if 조건]
연습) 1~10의 값 중 3의 배수만 골라 그 제곱 값으로 구성된 리스트 만들기
lst = [n**2 for n in range(1, 11) if n % 3 == 0]
print(lst)
>>> [9, 36, 81]
🚀 리스트 관리
💡 삽입
# 예시 1
nums = [1, 2, 3, 4]
nums[2:2] = [90, 91, 92]
print(nums)
>>> [1, 2, 90, 91, 92, 3, 4]
# 예시 2
nums = [1, 2, 3, 4]
nums[2] = [90, 91, 92]
print(nums)
>>> [1, 2, [90, 91, 92], 4]
위의 예시 1의 경우, [2:2] 범위의 길이는 0이지만 삽입할 위치를 알려주는 역할을 하게 되어 길이 0의 범위에 길이 3의 리스트를 대입, 즉 세 개의 요소를 삽입하는 것과 같음
반면 예시 2에서 [2]번째 위치의 요소에 리스트를 대입하는 것은 대입에 의해 2번째 요소값이 길이 3의 리스트로 대체되어 요소 개수에는 변화가 없으나 리스트끼리 중첩이 가능하므로 요소 자리에 리스트가 들어가게 됨
리스트에 리스트를 추가하여 병합하고 싶을 때는? extend 사용!
list1 = [1, 2, 3, 4, 5]
list2 = [10, 11]
list1.extend(list2) # list1 += list2 와 같은 결과
print(list1)
>>> [1, 2, 3, 4, 5, 10, 11]
💡 삭제
score = [88, 95, 70, 100, 99, 80, 78, 50]
score.remove(100) # 요소값 직접 삭제
print(score)
del(score[2]) # 순서값 지정하여 삭제. del score[2]로도 호출 가능
print(score)
score[1:4] = []
print(score) # 요소 여러 개 삭제. del score[1:4] 로도 가능
[88, 95, 70, 99, 80, 78, 50]
[88, 95, 99, 80, 78, 50]
[88, 78, 50]
👀 pop()
- remove와 del은 요소를 지우기만 하는 데에 비해 pop은 삭제한 요소를 꺼내 리턴
- 첨자를 지정하여 지울 대상을 지정하되 인수가 없으면 마지막 요소 pop
- 인수 생략시 pop(-1)을 호출하는 것과 같음
- 리스트의 끝에서 append로 추가하고 pop으로 제거하면 선입선출(FIFO) 방식으로 동작하는 스택(Stack)
score = [88, 95, 70, 100, 99]
print(score.pop())
print(score.pop())
print(score.pop(1))
print(score)
99
100
95
[88, 70]
💡 검색
- index: 특정 요소의 위치를 찾으며 발견되지 않을 경우 예외 발생
- count: 특정 요소값의 개수 조사
score = [88, 95, 70, 100, 99, 80, 78, 50]
perfect = score.index(100)
print("만점 받은 학생은 %d번입니다." % perfect)
pernum = score.count(100)
print("만점자 수는 %d명입니다." % pernum)
만점 받은 학생은 3번입니다.
만점자 수는 1명입니다.
- 리스트 내 요소 유무 판별: in/ not in 연산자 사용
ans = input("결제하시겠습니까? ")
if ans in ['yes', 'y', 'ok', '네', '좋아요']:
print("구입해주셔서 감사합니다!")
else:
print('안녕히 가세요.')
결제하시겠습니까? yes
구입해주셔서 감사합니다!
💡 정렬
👀 sort/reverse 메서드
score = [88, 95, 70, 100, 99]
score.sort() # default: reverse=False > 오름차순 정렬 reverse=True시 내림차순 정렬
print(score)
score = [88, 95, 70, 100, 99]
score.reverse() # 원 리스트의 요소의 순서를 반대로 뒤집음
print(score)
[70, 88, 95, 99, 100]
[99, 100, 70, 95, 88]
👀 key 인수
정렬 시 요소를 비교할 키를 추출하는 함수로 키를 변형하여 비교 기준으로 사용
country = ["Korea", "japan", "CHINA", "america"]
country.sort()
print(country)
country.sort(key = str.lower) # 비교할 때만 잠시 소문자로 바뀔 뿐 요소 자체가 바뀌는 것은 아님
print(country)
['CHINA', 'Korea', 'america', 'japan']
['america', 'CHINA', 'japan', 'Korea']
👀 sorted 함수
- 리스트는 그대로 두고 정렬된 새로운 리스트를 만들어 리턴
- 원본은 유지되므로 정렬된 결과를 별도의 변수에 대입받아야 함
- sort 메서드와 마찬가지로 reverse, key 키워드 인수를 통해 내림차순으로 정렬하거나 비교방식 지정
score = [88, 95, 70, 100, 99]
score2 = sorted(score)
print(score)
print(score2)
[88, 95, 70, 100, 99]
[70, 88, 95, 99, 100]
Leave a comment