본문 바로가기
코딩/Python

[파이썬 활용] 친구와 함께 여행 사진 고르기(리스트의 교집합 구하기)

by 나홀로코더 2022. 4. 8.
반응형

목차

1. 주제 소개

2. 파일 목록 가져오기

3. 파일 목록 간에 겹치는 항목 뽑아내기


 

1. 주제 소개

 

생활 속에서 파이썬을 활용하는 사례를 소개하려 한다.

 

여행을 한번 다녀 오면 많게는 수천 장의 사진을 찍어 오게 된다.

 

추억을 남기기 위해서 앨범을 하나 만들고 싶은데, 모든 사진을 인화할 수는 없으니 그 중에서 마음에 드는 사진을 골라야 한다.

 

그런데 여행을 함께 다녀 온 친구가 있다면 내 마음대로 고를 수는 없고 친구와 함께 골라야 한다

 

같이 자리에 앉아서 고르면 좋겠지만, 그럴 여건이 안 되어 각자 마음에 드는 사진을 고른 다음 서로 겹치는 사진을 인화하기로 하고, 각자 마음에 드는 사진들을 서로 다른 폴더에 모았다고 하자.

 

이때, 친구와 내가 모두 고른 사진을 추려내는 작업을 파이썬으로 해보자.

 

 

반응형

 

2.파일 목록 가져오기

 

친구와 내가 고른 파일 목록을 비교하려면, 먼저 파일 목록을 불러와야 할 것이다.

 

사진 파일들은 아래와 같이 D드라이브 내 2개의 폴더에 저장되어 있다고 가정한다.

 

D:/내사진

D:/친구사진

 

 

폴더 내의 파일 목록을 가져오려면 os 패키지의 listdir() 함수를 사용하면 된다.

 

아래와 같이 코드를 작성하면 me와 friend에 각각의 파일 목록이 저장된다.

 

 

from os import listdir

me = listdir("D:/내사진")

friend = listdir("D:/친구사진")

 

3. 파일 목록 간에 겹치는 항목 뽑아내기

 

이제 두 목록을 비교해 친구와 내가 모두 고른 사진을 뽑아내 보자.

 

여러 가지 방법이 있겠는데, 그 중에 두 가지를 소개한다.

 

3.1. in 연산자를 이용하는 방법

 

우리가 위에서 추출한 파일 목록은 파이썬 리스트 형태이다.

 

리스트에 어떤 항목이 있는지 없는지는 in 연산자를 이용해 확인할 수 있다.

 

>>> a = [1, 2, 3]

>>> 1 in a

True

 

in 연산자는 항목별로만 검사할 수가 있고, 여러 항목을 동시에 검사하지는 못한다. 아래의 예를 보면 1과 2는 리스트 a에 있지만, 리스트 [1, 2]가 a에 있는지 검사해 보면 항목별로 검사하는 것이 아니라 그 리스트 자체가 a의 요소 중에 있는지를 검사하기 때문에 False가 출력된다.

 

>>> a = [1, 2, 3]

>>> [1, 2] in a

False

 

따라서 두 리스트의 항목들 중에서 겹치는 항목을 모두 뽑아 내려면, 반복문을 이용해서 항목별로 검사를 해줘야 한다.

 

예제의 me와 friend 리스트의 비교는 아래와 같이 리스트 컴프리헨션을 이용하면 한줄로 해결할 수 있다.

 

[i for i in me if i in friend]

 

위 코드가 이해되지 않는다면 리스트컴프리헨션에 관한 아래 게시글을 읽어보기 바란다.

 

파이썬에서 코드 한줄로 리스트(딕셔너리, 집합, 제너레이터) 만들기/리스트컴프리헨션, list comprehension

 

파이썬에서 코드 한줄로 리스트(딕셔너리, 집합, 제너레이터) 만들기/리스트컴프리헨션, list compr

서론 파이썬의 기초를 배우고 있는 사람이라면 아래와 같은 코드를 한번쯤 보았을 것이다. 반복문을 이용해 리스트를 만드는 방법으로, 대부분의 튜토리얼에서 이 방법을 먼저 선보이고 있는

codealone.tistory.com

 

3.2. set()와 & 연산자를 이용하는 방법

 

위에 소개한 리스트컴프리헨션도 충분히 간단하긴 하지만, 리스트컴프리헨션은 가독성이 떨어진다며 싫어하는 사람들이 많다.

 

대신 리스트를 집합(set)으로 변환해주면, & 연산자를 이용해 말그대로 교집합을 바로 구할 수 있다.

 

코드는 다음과 같다.

 

set(me) & set(friend)

 

이렇게 하면 내사진 폴더와 친구사진 폴더의 교집합이 바로 계산되어 출력된다.

 

이렇게 친구와 내가 모두 고른 사진의 목록을 구해낸 다음에는 shutil 등 파일을 이동하거나 복사할 수 있는 패키지를 이용하면 인화할 사진들만 뽑아내 따로 저장할 수도 있다.

 

반응형

 


 

나름대로 파이썬을 간단히 활용해볼 만한 과제라는 생각이 들어 소개하게 되었는데 소개글을 다 써놓고 보니 더 쉬운 방법이 떠올랐다.

 

친구사진 폴더에 있는 사진을 전부 복사해서 내사진 폴더에 붙여넣기 하면, 중복되는 사진들에는  "- 복사본" 표시가 붙을 테니 해당 표시가 붙은 사진만 뽑아내면 될 것 같다.

 

"망치를 든 사람에게는 모든 문제가 못으로 보인다."라는 근래에 새로 알게 된 격언이 떠오르긴 하지만, 어쨌든 망치 쓰는 데에 더 익숙해질 수 있다면 나름대로 도움이 될 것 아닌가 싶기도 하다.

반응형

댓글