본문 바로가기
[Language] - Python

# 10. [Tip] lambda, map, zip 응용

by Bebsae 2021. 4. 1.

필자는 오늘 동료의 코드를 보는 도중 중복이 매우 심한 코드를 보고말았다. 상황은 다음과 같다.

PyQT 에서 QTableWidget에 출력해야할 데이터가 많은 상황이었다. 컬럼이 특히 많았는데 이 컬럼들을 일일이 QTableWidgetItem 인스턴스를 초기화하여 set 하는 상황이었다.. 대략 난감 -_-;;

 

그래서 UserRole Data는 전부 같고 Display Role 데이터만 다른 상황이었기에 필자는 이렇게 해결했다.

        display_tuple = (
            dxf_feature.layer.name(),
            dxf_feature.legend_name,
            dxf_feature.layer_name,
            dxf_feature.layer_code,
            dxf_feature.label,
            dxf_feature.label_material,
            dxf_feature.label_pi,
            dxf_feature.label_length,
            dxf_feature.length,
            dxf_feature.label_dip,
            dxf_feature.aver_dip,
            dxf_feature.max_dip,
            dxf_feature.min_dip,
            dxf_feature.aver_pipe_ceiling,
            len(dxf_feature),
            dxf_feature.center_pos
        )
        display_tuple = tuple(map(lambda x: round(x, 5) if type(x) == float else x, display_tuple))

map() 메소드의 첫 번째 인스턴스로는 function, 두 번째 인스턴스로는 iterable한 인스턴스가 온다. 고로 첫 번째 인스턴스에 lambda function으로 삼항연산자를 사용하여 display_tuple의 데이터가 float 타입일 경우에만 소수점 아래 5번째 자리에서 반올림을 하는 lambda function을 인자로 대입했다.

 

        display_data = map(str, display_tuple)
        user_data = [dxf_feature] * len(display_tuple)
        display_user_data = zip(display_data, user_data)

        for d, u in display_user_data:
            item = QTableWidgetItem(d)
            item.setData(Qt.UserRole, u)
            yield item

그리고 위에서 언급했다시피 UserRole Data는 전부 같으므로 DisplayRole Data 갯수만큼 요소를 증가시킨 뒤, zip() 메소드를 활용했다.

 

처음에는 list comprehension과 lambda function을 활용하고 싶었지만 필자의 머릿속에서는 마땅히 좋은 방법이 생각나지 않았다.

'[Language] - Python' 카테고리의 다른 글

# 12. 제너레이터 (Generator)  (0) 2021.04.14
# 11. [Tip] dictionary merge  (0) 2021.04.14
#9. lambda, map, reduce, filter  (0) 2021.03.25
#8. [Tip] if, 삼항연산자가 사용하기 싫을 때  (0) 2021.03.24
#7. zip  (0) 2021.03.24

댓글