상세 컨텐츠

본문 제목

map, lambda, zip, filter, reduce의 사용

Python

by techbard 2023. 5. 3. 00:18

본문

반응형
### 람다 사용
"""
1. 아규먼트는 제한 없이 사용 가능, 단 평가식은 한 개만
2. 함수 객체가 쓰이는 곳이면 대용 가능 (람다는 함수 객체를 반환)
"""
def main():
    IsEvenOrOdd = \
    lambda n : "Even number" if n % 2 == 0 else "Odd number"

    print(IsEvenOrOdd(19))
    print(IsEvenOrOdd(20))

if __name__ == '__main__':
    main()

#결과
Odd number
Even number
### 람다 평가식의 활용
def main():
    choice_nums = \
    lambda s : ''.join([n for n in s if n.isdigit()])
    print(choice_nums('apple101'))

    print('\t')

    find_sum = \
    lambda s : sum([int(n) for n in str(s)])
    print(find_sum('101'))

if __name__ == '__main__':
    main()

#결과
101
	
2
### 함수에 람다 사용
def main():
    l = ['1', '2', '9', '0', '-1', '-2']
    print('Sorted numerically:', sorted(l, key=lambda n : int(n)))
    print('Filtered positive even numbers:', \
    list(filter(lambda n : (int(n) % 2 == 0 and int(n) > 0), l)))
    print('Operation on each item using lambda and map:', \
    list(map(lambda s : str(int(s) + 1), l)))

if __name__ == '__main__':
    main()

#결과
Sorted numerically: ['-2', '-1', '0', '1', '2', '9']
Filtered positive even numbers: ['2']
Operation on each item using lambda and map: ['2', '3', '10', '1', '0', '-1']

 

### map의 사용예 (지정된 함수로 시퀀스 객체를 처리)

def main():
    nums = 5

    even_result = list(map(mymod, range(nums)))
    ds = dict(zip(range(nums), even_result))
    print('Is even? =>', ds)

    pass


def mymod(n):
    if n % 2 == 0:
        return True
    else:
        return False

if __name__ == '__main__':
    main()

# 결과
Is even? => {0: True, 1: False, 2: True, 3: False, 4: True}

 

### 리스스의 star 개수를 읽어 index, len(star) dict 생성
import random

max_star_len = 10
def main():
    ls = []
    d = {}
    for i in range(10):
        ls.append('*' * random.randint(0, max_star_len))

    ### for - enum을 통한 첨자 할당
    for i, l in enumerate(ls):
        d[i] = len(ls[i])

    print(ls)
    print(d)

    print('\t')

    ### map, zip을 통한 묶음 dict 생성
    l = list(map(len, ls))
    d = dict(zip(range(max_star_len), l))

    print(ls)
    print(d)

if __name__ == '__main__':
    main()
 
 #결과
 ['**********', '**********', '', '*********', '***', '********', '***', '****', '*******', '*']
{0: 10, 1: 10, 2: 0, 3: 9, 4: 3, 5: 8, 6: 3, 7: 4, 8: 7, 9: 1}
	
['**********', '**********', '', '*********', '***', '********', '***', '****', '*******', '*']
{0: 10, 1: 10, 2: 0, 3: 9, 4: 3, 5: 8, 6: 3, 7: 4, 8: 7, 9: 1}

 

### map 클래스에 원하는 객체 타입을 지정해 변환
def main():

    m = map(str, [1, 2, 3])
    ls = list(m)

    print(ls)
    print(type(ls[0]))

    print('\t')

    s = map(int, ['1', '2', '3'])
    li = list(s)

    print(li)
    print(type(li[0]))

if __name__ == '__main__':
    main()
 
 #결과
 ['1', '2', '3']
<class 'str'>
	
[1, 2, 3]
<class 'int'>

 

# 클래스에 range 객체도 던질 수 있다.

m = map(str, range(1, 11))

s = ''.join(m)

print(type(s), "s: {}".format(s))

 

# 결과

<class 'str'> s: 12345678910

 

# map, lambda 혼용

ls = list(range(1, 6))

lm = map(lambda x: x+1, map(int, ls))

print(list(lm))

 

# 결과

[2, 3, 4, 5, 6]

 

 

### list comprehension과 zip의 사용
### 두 개의 쌍 중에서 더 큰 값을 리턴

def main():
    lx = [5, 2, 3]
    ly = [1, 2, 4]

    ls = [max(x, y) for x, y in zip(lx, ly)]
    print(ls)

if __name__ == '__main__':
    main()

#결과
[5, 2, 4]
### 람다를 이용 짝 중 큰수를 리턴
def main():
    a = [5, 2, 3]
    b = [1, 2, 4]

    r = map(lambda pair : max(pair), zip(a, b))
    print(list(r))

if __name__ == '__main__':
    main()

#결과
[5, 2, 4]
### 람다, max 함수를 이용해 두 개의 쌍 중에서 더 큰 값을 리턴
def main():
    l1 = [1, 3, 5, 7]
    l2 = [2, 4, 6, 8]

    l = list(map(lambda x, y : max(x, y), l1, l2))
    print(l)

if __name__ == '__main__':
    main()

#결과
[2, 4, 6, 8]

 

### filter
### 이터러블에서 특정 조건의 함수 결과가 True인 것만 추림

def getEvens(n):
    if n % 2 ==0:
        return True

def main():
    r1 = list(filter(getEvens, [1, 2, 3, 4, 5]))
    print('r1:', r1)
    print('\t')

    r2 = list(filter(lambda n : n % 2 == 0, [1, 2, 3, 4, 5]))
    print('r2:', r2)
    print('\t')

    r3 = list(filter(lambda n : True if n % 2 == 0 else False, [1, 2, 3, 4, 5]))
    print('r3:', r3)

if __name__ == '__main__':
    main()

#결과
r1: [2, 4]
	
r2: [2, 4]
	
r3: [2, 4]

 

### reduce의 결과는 single value
import functools

def main():
    ls = [1, 2, 3]
    r = functools.reduce(lambda x, y: x + y, ls)
    print(type(r))
    print(r)

if __name__ == '__main__':
    main()

#결과
<class 'int'>
6

 

### reduce 이터러블을 받아 연산 후에 연산 결과의 누적을 리턴
### pair에 대한 연산을 전체 이터러블로 확대할 때 사용
### 명시적인 loop 구현 없이 이터러블 처리
### 단일값만 리턴 (객체 리턴 X)
import functools

def main():
    data = [{'name' : 'a', 'age' : 1},
    {'name' : 'b', 'age' : 2}, {'name' : 'c', 'age' : 3}]

    # 초기값이 없으면 에러 발생
    r = functools.reduce(lambda x, y : x + y['age'], data, 0)

    print(r)

if __name__ == '__main__':
    main()

#결과
6

 

### reduce가 for-loop 없이 비슷한 효과를 낸다.
### 이런 특성을 이용해 문자열 합치기
import functools

def main():
    ls = ['a', 'p', 'p', 'l', 'e']
    s = functools.reduce(lambda x, y : x + y, ls)
    print(type(s))
    print(s)

if __name__ == '__main__':
    main()

#결과
<class 'str'>
apple

 

### flattening a list of lists into a single list
import functools

def main():
    list_2D = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    r = functools.reduce(lambda x, y : x + y, list_2D)
    print(type(r))
    print(r)

if __name__ == '__main__':
    main()

#결과
<class 'list'>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
### for-loop 없이 reduce를 사용해 함수 적용
import functools

def main():
    ls = [11, 9, 12, 15, 7, 13]

    r = functools.reduce(lambda x, y : min(x, y), ls)
    print(type(r))
    print('min:', r)

    r = functools.reduce(lambda x, y : max(x, y), ls)
    print(type(r))
    print('max:', r)

if __name__ == '__main__':
    main()

#결과
<class 'int'>
min: 7
<class 'int'>
max: 15

 

 

# ord(c, /)

# Return the Unicode code point for a one-character string.

o = (list(map(ord, 'hello')))

print(list(map(chr, o)))

 

# 결과

['h', 'e', 'l', 'l', 'o']

 

 

 

### 문자열 리스트를 받아 그중 가장 긴 문자열 출력

def makePairs(ls):
    return dict(zip(ls, map(len, ls)))

def main():
    pairs, ret = [], []
    inList = ['aaa', 'bb', 'cccc', 'd', 'eeeeeeeeee']
    pairs = makePairs(inList)
    maxlen = max(pairs.values())

    for k, v in pairs.items():
        if v == maxlen:
            ret.append(k)

    print(ret)

    pass

if __name__ == '__main__':
    main()

# 결과

['eeeeeeeeee']
반응형

관련글 더보기

댓글 영역