본문 바로가기

파이썬(프로그래머스쿨)

[파이썬] 두개의 리스트에서 동일한 원소들을 제거하는 방법

반응형

안녕하세요. 오늘은 두 개의 리스트에서 동일한 원소들을 제거하는 방법을 알아보고자 합니다.

 

문제 : 두개의 리스트에서 동일한 원소들을 제거한 나머지를 출력하라.
A = ["leo", "kiki", "eden"]
B = ["eden", "kiki"]
문제설명 

두개의 리스트에서 A는 참여자 명단이고, B는 완료자 명단입니다. A인원 중에 B에 포함되지 않은 인원을 찾아서 출력하면 됩니다. 

결과
"leo"

 

이런 결과를 얻기 위해서는 다음과 같은 간단한 식으로 풀이됩니다.

A_sub_B = [x for x in A if x not in B]

 

지금의 사례에서는 만족하지만, 다음의 사례에서와 같이 중복데이터가 있는 경우, 위 코드가 원활한 값을 출력하지 못합니다.

A = ["mislav", "stanko", "mislav", "ana"],
B = ["ana","stanko", "mislav"]

 

이런 경우, mislav이라는 사람이 A리스트에 두번 나옵니다. 하지만 mislav는 동명이인이기 때문에, 앞에 코드로 실행시 모두 충족되어 결과값에 아무도 출력을 못하게 됩니다.

결과
[]

 

이런경우 어떻게 해야 할까요?

원리

저는 리스트 A, B에 나온 것의 각 원소개수를 세고, 같은 원소일 경우, 리스트 A에서 리스트 B의 개수를 뺀 게 1 이상이면 출력하도록 설정하였습니다.

  위와 같은 수식을 진행하려면, dict 함수와 counter기능을 사용하면 쉽게 해결할 수 있습니다.

from collections import Counter
# dict생성  함수 -> participant, completion의 원소들 개수를 파악
def make_dict(array):
    counter = dict(Counter(array))

    return counter
    
def solution(participant, completion):
    
    answer = []
    dup_par = list(set(participant)) # 중복되지 않은 참가자들의 리스트 생성.

    par_count = make_dict(participant)
    com_count = make_dict(completion)

    for i in range(0, len(dup_par)):#길이 : 0부터 중복되지 않은 참가자들의 수-1 만큼 반복

        if par_count.get(dup_par[i]) - com_count.get(dup_par[i], 0) >= 1: # 만약 par_count(참가자들의 성분 수)- com_count(완료자들의 성분수)가 1이상일때, 답을 추가하라.
            answer.append(dup_par[i])
            
	return answer

 

 

그러면 결괏값으로 이렇게 나오는 것을 확인할 수 있습니다.

['mislav']

 

반응형