반응형
안녕하세요. 오늘은 두 개의 리스트에서 동일한 원소들을 제거하는 방법을 알아보고자 합니다.
문제 : 두개의 리스트에서 동일한 원소들을 제거한 나머지를 출력하라.
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']
반응형
'파이썬(프로그래머스쿨)' 카테고리의 다른 글
리스트에서 같은 숫자가 연속으로 올때 연속으로 오는 숫자 모두 제거하는 방법[파이썬] (0) | 2022.12.24 |
---|---|
리스트 안에서 특정값들(리스트)에 해당하는 값만 출력하고 싶을때[파이썬] (2) | 2022.12.24 |
[파이썬] 리스트안에 2차원배열의 위치바꾸기!( feat. 최소 직사각형 문제) (0) | 2022.12.21 |