Hash 3. に見せかける


1.質問



2.私の回答


(服装の種類の個数1)-1(何も着ていない場合を除く)を乗じて答えを得る.
まずFirst for Moonで服の並びの中の服装の種類を数えます.
2番目のfor文により,アパレル組合せの個数を与えた.
def solution(clothes):
    answer = {}
    for i in clothes:
        if i[1] in answer:
            answer[i[1]] += 1
        else:
            answer[i[1]] = 1
    
    cnt = 1
    for i in answer.values():
        print(i)
        cnt *= (i + 1)
    return cnt-1

3.その他の解釈


コンセプトは同じですが、コードはCollections、functoolsモジュールを使用してより簡単に記述されています.
Counterを使ったkindforname、kind in衣装
服の第二要素服の種類は返却されます.
それらを会計します.次にlambda関数を使用してcntの値を指定します.
1に値を乗算し、最後にreduce 1に復元します.
def solution(clothes):
    from collections import Counter
    from functools import reduce
    cnt = Counter([kind for name, kind in clothes])
    answer = reduce(lambda x, y: x*(y+1), cnt.values(), 1) - 1
    return answer

4.新しい事実


Pythonではlambdaを使用して関数をより簡潔に記述できます.
def add(x,y)
	return x+y
    
(lambda x,y: x + y)(10, 20)
map()、reduce()、filter()などを併用すると、複数の操作を実行できます.
#map(함수,리스트)
print(*map(lambda x: x**2,range(5)))
#range(5)의 숫자들을 lambda 함수 x**2에 넣어 출력
#즉 0~4까지의 숫자들의 제곱을 출력
#0 1 4 9 16

#reduce(함수,시퀀스,초기값)
from functools import reduce
reduce(lambda x, y: x + y, [0, 1, 2, 3, 4])
#[0,1,2,3,4]의 숫자들을 누적하여 lambda 함수에 적용한다 초기값을 설정하면 그것부터 시작.
#0+1=1 -> 1+2=3 -> 3+3=6 -> 6+4=10
#결과는 10
reduce(lambda x, y: y + x, 'abcde')
#b+a=ba -> c+ba=cba -> d+cba=dcba -> e+dcba=edcba
#결과는 edcba

#filter(함수,리스트)
list(filter(lambda x: x % 2, range(10)))   
#0~9까지중 x%2 해서 참,즉 1보다 큰 수가 나오는,
#2로 나누었을때 나머지가 1인 홀수들을 출력하게 된다.
#map을 사용하면 리스트의 숫자들이 변한 값이 나오고
#filter를 사용하면 리스트의 숫자들이 그대로 나온다.
print(*filter(lambda x:   x%2==0, range(10)))
#짝수를 출력하는 방법

5.ソース


に見せかける