[파이썬3.0] 집합을 이용한 중복 제거 방법

프로그램 언어/파이썬|2014. 6. 24. 22:48

집합을 이용한 중복 제거 방법


 


집합을 사용하여 중복 제거하는 방법을 알아보자.


 

집합을 이용하면 보다 편하게 중복을 제거할 수 있다.

왜냐하면 집합의 특징이 중복제거이기 때문이다.

집합은 중복된 값을 받을 수 없다.
집합을 설명하자면
xxxx = { } 형태의 구조로 되며
xxxx= set() 으로도 선언할 수 있다.
set()내장 함수는 기존의 리스트를 인자로 받을 수 있다.

set()은 팩토리 함수이다.

팩토리 함수
특정 형의 데이터 항목을 새로 만들기 위해 사용.

집합(set)을 이용한 코드
ex_set_rank.py

def 동일화(time_string):
    if '-' in time_string:
        splitter='-'
    elif ':' in time_string:
        splitter=':'
    else:
        return(time_string)

    (mins,secs) = time_string.split(splitter)
    return(mins+'.'+secs)

with open('james.txt') as 제임스파일:
    data=제임스파일.readline()
제임스 = data.strip().split(',')

with open('julie.txt') as 줄리파일:
    data=줄리파일.readline()
줄리 = data.strip().split(',')

with open('mikey.txt') as 미키파일:
    data=미키파일.readline()
미키 = data.strip().split(',')

with open('sarah.txt') as 사라파일:
    data=사라파일.readline()
사라 = data.strip().split(',')

print(sorted(set([동일화(t) for t in 제임스]))[0:3])
print(sorted(set([동일화(t) for t in 줄리]))[0:3])
print(sorted(set([동일화(t) for t in 미키]))[0:3])
print(sorted(set([동일화(t) for t in 사라]))[0:3])

변화된 부분은 print문과 u_제임스와 같은 중복 제거하는 분의 삭제이다.
이렇게 중복된 부분을 제거하는 코드가 없어지므로써 
코드는 확연히 줄어 들었다.

set()함수 자체가 중복을 제거하는 역할을 하기 때문에 가능한 일이다.
리스트는 중복을 제거하는 부분을 사용자가 만들어주어야 하기에 코드가 복잡해진다. 
집합을 이용하면 이러한 부분을 쉽게 처리할 수 있다.

그러나 위 코드도 반복되는 무언가가 있는데 
알아 차렸을까나???

바로 파일을 열어서 스플릿하는 과정인데, 이 부분을 함수로 만들어 둔다면 좀더 편리할 것이다.
함수로 만들때는 중복된 부분을 보고 그것을 최대한 통합할 수 있는 방법으로 구현해야 한다.

ex_set_for_rank3.py

def 동일화(time_string):
    if '-' in time_string:
        splitter='-'
    elif ':' in time_string:
        splitter=':'
    else:
        return(time_string)

    (mins,secs) = time_string.split(splitter)
    return(mins+'.'+secs)

def 파일열기(file_name):
    try:
        with open(file_name) as 파일:
            data=파일.readline()
        누구 = data.strip().split(',')
        return(누구)
    except IOError as ioerr:
        print('File error: ' + str(err))
        return(None)

'''
with open('james.txt') as 제임스파일:
    data=제임스파일.readline()
제임스 = data.strip().split(',')

with open('julie.txt') as 줄리파일:
    data=줄리파일.readline()
줄리 = data.strip().split(',')

with open('mikey.txt') as 미키파일:
    data=미키파일.readline()
미키 = data.strip().split(',')

with open('sarah.txt') as 사라파일:
    data=사라파일.readline()
사라 = data.strip().split(',')'''


제임스 = 파일열기('james.txt')
줄리 = 파일열기('julie.txt')
미키 = 파일열기('mikey.txt')
사라 = 파일열기('sarah.txt')

print(sorted(set([동일화(t) for t in 제임스]))[0:3])
print(sorted(set([동일화(t) for t in 줄리]))[0:3])
print(sorted(set([동일화(t) for t in 미키]))[0:3])
print(sorted(set([동일화(t) for t in 사라]))[0:3])

'파일열기'라는 함수를 구현해서 중복 수행하는 with문을 안에 두었다.
인자로는 파일명만을 받게 하여 파일명을 인자로 전달하면 리스트 형태로 데이터를 불러온다.
각 객체에 그 리스트를 할당하게 함으로써 길었던 문장이 조금은 간단해진 듯 하다.

참고 : headfirst python, 파이썬3 바이블

댓글()