데이터분석

[23.06.08] Python lambda, filter, map, zip, 정렬(sort, reverse) - 05(1)

gmwoo 2023. 6. 8. 11:02

1. lambda (람다)

- 이름이 없는 함수. 일회용 함수

2. filter(함수, iterable 객체)

 - filter(함수, iterable객체)
 - 함수, 반환값이 True or False
 - 함수의 실행 결과가 True면 그 데이터만 보내고, False면 데이터를 보내지 않음
 - 특정 조건에 맞는 데이터를 추출하고자 할 때
예제 1) 함수를 lambda와 filter를 사용하여 짧은 코드 만들기

nums = [1, 2, 3, 33, 4, 6, 23, 26, 17, 19, 21, 8, 19, 27]
# 짝수만 필터링

evenList = []  # 리스트 타입 객체를 만듦
for n in nums:
    if n%2==0:
        evenList.append(n)
print(evenList)

############################# 위의 코드를 함수로 만듦
## 조건식만 바꾸면 됨
# 함수를 함수의 매개변수로 전달 (compare)
# 함수도 주소 -> 변수에 함수를 저장할 수 있음
# 함수에 매개변수로 전달되는 함수는 콜백함수라고 부름
 ### 호출자가 직접하는게 아니고 다른 함수
 ### 함수의 매개변수나 반환값의 결정자는 본인이 아니며 약속된 형태만 보내야 함
def myfilter(compare, nums):
    evenList = []
    for n in nums:
        if compare(n):
            evenList.append(n)
    return evenList

def myCompare(x):
    return x%2==0  # 짝수인가?
    
print(myfilter(myCompare, nums))

# def add(x, y):
#     return x+y
# calc = add  # 함수의 주소를 변수에 저장 가능
# print(calc(4, 5))

############################# 위의 함수를 filter, lambda로 변환
# 프로그램 중에 일부만 살짝 고칠 수 있다면 함수를 미리 만들고 나머지는 사용자가 완성하도록
print(list(filter(myCompare, nums)))

# myCompare 함수를 lambda로 변환하기
## lambda x : x%2==0     => return 사용 X, 한 줄
print(list(filter(lambda x: x%2==0, nums)))

 
예제 2) 문자 찾기

wordList = ["school", "book", "bookstore", "desk", "hospital", "survey",
            "assembly", "president", "python", "flower", "sky", "cloud",
            "language", "phone", "house"]

# 단어 길이가 5개 이상인 단어 추출
print(len("school")>=5)
## lambda와 filter 사용
for item in filter(lambda x: len(x)>=5, wordList):
    print(item)
    
# 단어가 b로 시작하는 것만 추출
print(list(filter(lambda u: u[0]=="b", wordList)))

# b를 포함하고 있는
print(list(filter(lambda w: "b" in w, wordList)))

 
3. map
 - 연산을 수행해서 값을 변형해서 반환
 - x => x' (연산이 가해진 변경된 x)

wordList = ["school", "book", "bookstore", "desk", "hospital", "survey",
            "assembly", "president", "python", "flower", "sky", "cloud",
            "language", "phone", "house"]
nums = [1,2,33,4,6,23,26,17,19,8,19,27]


# nums에 값을 10씩 더하기
print(list(map(lambda x: x+10, nums)))

# wordList 의 문자들을 대문자로 변환
print(list(map(lambda x: x.upper(), wordList)))

 
4. zip
 - zip(list1, list2, list3) => 각 원소들끼리 결합해서 새롱룬 튜플로 만들어서 반환

nameList = ["홍길동", "임꺽정", "장길산"]
phoneList = ["010-0000-0001", "010-0000-0002", "010-0000-0003"]
emailList = ["1", "2", "3"]

for data in zip(nameList, phoneList, emailList):
    print(data, type(data))

 
5. 정렬 (sort, reverse)
 - 두 가지 종류
  1) 자기 자신의 순서는 그대로, 바뀐 순서만 반환
  2) 자기 자신의 순서를 바꿈

# list 타입에 존재하는 함수가 sort - 자기 자신의 순서 바꿈
# default: 오름차순 정렬
# 내림차순: reverse() 

nums = [1,2,33,4,6,23,26,17,19,8,19,27]

nums.sort()
print(nums)

nums.reverse()
print(nums)

# sorted(): 사용자 데이터 타입 (ex. list(dict()) 등)
dataList = [
    {"name": "강감찬", "age": 23},
    {"name": "감강찬", "age": 20},
    {"name": "김연경", "age": 33},
    {"name": "조승연", "age": 28},
    {"name": "김연아", "age": 30},
    {"name": "이순신", "age": 43},
    {"name": "서희", "age": 35},
    {"name": "윤관", "age": 27},
    {"name": "박세리", "age": 43},
]

# dataList -> 각 요소가 dict type
dataList.sort(key=lambda x: x["name"])
print(dataList)

# 역순 정렬
sortedDataList = sorted(dataList, key=lambda x: x["name"], reverse=True)
print(sortedDataList)

# 나이순으로 정렬
print(sorted(dataList, key=lambda x: x["age"]))

# 나이순으로 역정렬
print(sorted(dataList, key=lambda x: x["age"], reverse = True))

 
 

반응형