without haste but without rest
[python / 계프] 4주차 자율과제 - key, 람다 연습 본문
import random
def make_score(a=30, b=99, dup=True):
names = [chr(name) for name in range(ord('a'), ord('z'))]
random.shuffle(names)
if dup == True:
scores = [[random.randint(a, b) for _ in range(5)] for _ in range(8)]
res = list(zip(names, scores))
return res
else:
scores = [random.sample(range(10, 100), 5) for _ in range(8)]
res = list(zip(names, scores))
return res
def print_list(score_list, number=False, rank=False):
if rank == True:
score_list.sort(key=lambda x:sum(x[1]), reverse=True)
for i, a in enumerate(score_list):
if number == True:
print('[{}] '.format(i+1), end='')
print('[{}] {}'.format(a[0], a[1]), end='')
if rank == True:
print(' 합산: {}점 / 평균: {}점'.format(sum(a[1]), avg(a[1])), end='')
print()
print()
avg = lambda x: sum(x) // len(x)
# (1) 일급합수 - 함수로 변수 선언하기
data1 = make_score()
# (2) 일급함수 - 함수를 매개변수로 받기
print_list(make_score(), number=True)
while True:
func_list = [sum, max, avg]
print("(1) 경기 시작\t(2) 점수 출력\n(3) 점수 합산\t(4) 경기 최고점수\n(5) 개인 최고점\t(6) 랭킹\n(0) 종료")
menu = int(input("=> "))
if menu == 0:
print('프로그램을 종료합니다.')
break
elif menu == 1:
player = make_score(dup=False)
print("경기 완료")
elif menu == 2:
print("{:^30}".format("<Player List>"))
print_list(player)
elif menu == 3:
for a in player:
print("[{}] 합산 {}점".format(a[0], sum(a[1])))
print()
elif menu == 4:
medal = ['1st', '2nd', '3rd']
# (3) 람다연습3 max
tmp = sorted(player, key=lambda x:max(x[1]), reverse=True)
print("{}".format("<MVP Player>"))
print('============')
for a in range(3):
print("{} [{}] {}점".format(medal[a], tmp[a][0], max(tmp[a][1])))
print('============')
elif menu == 5:
for a in player:
print("[{}] {}점".format(a[0], max(a[1])))
print()
elif menu == 6:
print("{:^30}".format("<Player Ranking>"))
print_list(player, number=True, rank=True)
else:
print("다시 입력해주세요. \n")
map, filter를 2차원 리스트에 사용하게 되면 인자별로 접근하므로
인자 하나 하나에 적용하고 싶다면 포 루프로 한번 걸러서 사용하면 간단하게 처리 가능하다.
이외에 람다나 key 옵션은 시퀀스 타입의 인자 하나하나에 적용되는 식이므로 원리를 파악해두고 까먹지 않도로 하자.
# key, lambda 연습
# 함수를 리스트에 담아 사용하기
# key 매개변수 사용하기
func_list = [sum, max, avg, len, lambda x: sum(x) // len(x)]
animal = [('개', 3), ('고양이', 2), ('소', 9), ('팬더', 11), ('토끼',1), ('나무늘보', 5)]
n_list = [[1,2,1,1], [2,9,3], [1,4,5]]
print('리스트의 원래 상태 => ', n_list)
n_list.sort(key=func_list[0])
print('합계 기준으로 정렬 => ', n_list)
n_list.sort(key=func_list[4])
print('평균 기준으로 정렬 => ', n_list)
print('길이 기준으로 정렬 =>', sorted(n_list, key=len))
print()
print('가장 큰 리스트 =>', max(n_list, key=list))
print('가장 큰 리스트 =>', func_list[1](n_list, key=list))
print('가장 긴 리스트 =>', max(n_list, key=len))
print('2번 인덱스가 가장 큰 리스트 => ', max(n_list, key=lambda x: x[2]))
print()
# 튜플에서 람다 활용하기
# key 매개변수 사용하기
print('리스트의 원래 상태 => ', animal)
animal.sort(key=lambda x:len(x[0]))
print('문자 길이 기준으로 정렬 => ', animal)
animal.sort(key=lambda x:x[1])
print('숫자 크기 기준으로 정렬 => ', animal)
print()
print('이름이 가장 긴 동물 => ', func_list[1](animal, key=lambda x:len(x[0])))
print('나이 가장 많은 동물 => ', max(animal, key=lambda x:x[1]))
print('나이 가장 적은 동물 => ', min(animal, key=lambda x:x[1]))
print()
# map과 filter 함수에서 람다 사용하기
print('원본 리스트 => ', n_list)
temp_list = list(map(lambda x:x * 2, n_list))
res_list = []
for a in n_list:
res_list.append(list(map(lambda x:x*10, a)))
print('맵 합수 적용 리스트 => ', res_list)
filter_list = []
for a in res_list:
filter_list.append(list(filter(lambda x: x>20, a)))
print('필터 함수 적용 리스트 => ', filter_list)
'Homework' 카테고리의 다른 글
[python / 계프] 5주차 과제 - 딕셔너리 (0) | 2020.04.17 |
---|---|
[C / 자료구조] 5주차 과제 - 연결 리스트 추가 기능 구현 (0) | 2020.04.16 |
[C / 자료구조] 4주차 실습문제4 - 뱅킹 시뮬레이션 (0) | 2020.04.09 |
[C / 자료구조] 4주차 과제 - 뱅킹 시뮬레이션 (0) | 2020.04.09 |
[C / 자료구조] 4주차 실습문제3 - 덱(deque) (0) | 2020.04.09 |
Comments