without haste but without rest

[python / 계프] 4주차 자율과제 - key, 람다 연습 본문

Homework

[python / 계프] 4주차 자율과제 - key, 람다 연습

JinungKim 2020. 4. 14. 21:29
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)
Comments