[Python]리스트에 비어있는 값 필터링

Inung_92·2023년 6월 23일
2

Python

목록 보기
2/4
post-thumbnail

포스팅 목적

배열 또는 리스트에 빈 문자열('') 등 비어있는 값이 들어있는 경우 제거하거나 체크하는 방법에 대해서 알아보자.

비어있는 값이란?

유효하지 않는 데이터. 즉, 결측 데이터를 의미한다.

결측데이터의 종류

  • 'None'
  • 'False'
  • '0'(정수형 0)
  • '0.0'(부동 소수점형 0)
  • ''(빈 문자열)
  • '[]'(빈 리스트)
  • '{}'(빈 딕셔너리)
  • '()'(빈 튜플)
  • 'set()'(빈 집합)
  • 'Oj'(복소수형 0)

위의 값들은 결측데이터로 판단이 가능하며 사용하는 언어에 따라 상이할 수 있다는 점을 인지하자.

체크해야하는 이유

비어있는 값. 즉, 결측데이터를 확인하고 측정해야하는 이유는 올바른 데이터가 입/출력 되는지 여부와 데이터의 수를 이용하여 반복문 등을 사용하는 경우 결측 데이터가 포함되는 경우를 방지하기 위해서이다.

물론 결측 데이터가 의도적으로 필요한 경우들도 있지만 그런 부분은 개발자가 의도한 것이기에 결측데이터의 존재를 인지하고 있다고 판단하고 넘어가보자.

예를 들어 개행문자('\n')를 기준으로 split() 함수를 사용한다고 가정했을 때 다음과 같은 행이 입력되면 split() 함수의 결과는 어떻게 나올까?

row = '2023-03-03 00:00, data1, data2, data3\n'

print(row.split('\n')
print(len(row))

결과는 다음과 같다.

[2023-03-03 00:00, data1, data2, data3, '']
2

개행문자를 기준으로 데이터를 나누면 빈 문자열이 포함된다. 그 이유는 split() 함수를 사용하여 문자열을 분리하게 될 경우 문자열의 마지막에 해당 조건인 문자가 있다면 빈 문자열이 생성되는 것이다.

쉽게 말해서 위의 예시에서 개행 문자를 기준으로 분리를 했는데 개행 문자가 문자열의 마지막에 있기 때문에 빈 문자열이 생성되는 것이다.

이렇듯 경험이 많은 개발자라면 이러한 규칙 등에 대해서 알고 있겠지만 나는 당연히 개행문자를 기준으로 분리하면 앞에 부분만 남을거라 생각했고, 뒤에 문자가 추가로 있어야지 요소가 추가된다고 생각했다.

즉 의도치 않은 결과를 만들 수 있기에 결측데이터를 확인하고, 제거해주는 로직이 필요한 것이다.


필터링

그렇다면 결측데이터를 제거할 수 있는 방법은 무엇이 있을까?

여러가지 방법이 있겠지만 이번 포스팅에서는 filter()bool() 함수를 이용해보려고 한다.

예시1

다음과 같은 리스트가 있다고 가정해보자.

test_list = [0, 2, 3, 4, False, 0]

위의 리스트의 결측데이터를 제거한 길이는 몇인지 확인해보자.

count = len(list(filter(bool, test_list)))

print(len(test_list))
print(count)

# 실행결과
6
3

결과에서 보이는 것처럼 결측데이터에 해당하는 0, False는 제외된 것을 확인할 수 있다.

예시2

이번에는 다음과 같은 문자열 데이터가 있다고 가정해보자.

row = '2023-06-13T13:00:00.00,NONE,NONE,NONE,NONE,NONE\n'

row를 split()을 이용하여 개행문자 기준으로 나누었을 때 리스트의 수를 알아보자.

row = row.split('\n')

count = len(list(filter(bool, row)))
print(len(row))
print(conut)

# 실행결과
2
1

개행문자를 기준으로 문자열을 나누고, 개행문자가 문자열의 마지막에 위치했기 때문에 빈 문자열이 리스트에 추가된다. filter(bool())를 이용해서 빈 문자열을 제거해주고 길이를 측정하면 유효한 데이터인 첫번째 요소만 남게 되는 것이다.


마무리

소켓 통신 프로젝트를 진행하며 1개의 행씩 데이터가 들어오고 해당 데이터를 개행문자를 기준으로 분리하여 가공하는 로직을 구성하다보니 결측데이터의 분리가 필수적으로 필요했었다. 그래서 찾아보게 된 방법중에 하나를 공유해보았다.

개발을 하다보면 언제나 예상치 못한 상황에 내가 모르고 있던 데이터가 끼어있는 경우들이 더러 발생한다. 이러한 부분들을 필터링을 통해 사전에 방지한다면 프로그램이 가동될 때 발생할 수 있는 예외 상황도 줄어들 것이라 생각된다.

profile
서핑하는 개발자🏄🏽

0개의 댓글