[Python] list comprehension

미남로그·2021년 12월 29일
0

파이썬 해도해도 안 느는 기분 ^^ 🚀

파이썬 기반 다지기 공사 들어갑니다.... 영차영차 🧱🧱🧱🧱🧱


List comprehensions

  • 기존 List 사용하여 간단히 다른 List를 만드는 기법
  • 포괄적인 List, 포함되는 리스트라는 의미로 사용됨
  • 파이썬에서 가장 많이 사용하는 방법 중 하나
  • 일반적으로 for + append 보다 속도가 빠름

for, append를 사용한 코드

먼저 for문과 append 함수를 사용해서 result라는 빈 리스트 안에 0부터 9까지의 값을 넣어주는 코드를 작성해보겠다.

result = []
for i in range(10):
    result.append(i)
    
print(result)

Out:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

이 값과 동일하게 만들어주는 list comprehension의 방법으로는

result = [i for i in range(10)]
print(result)

Out:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

[ ] 리스트 안에 for 문을 넣어주었고, 해당 for문이 앞의 ii에게 하나씩 할당되는 구조이다.(append 처럼)

또한, 여기서 if 문의 조건을 넣어줄 수 있는데,

result = [i for i in range(10) if i % 2 == 0]
print(result)

Out:
[0, 2, 4, 6, 8]

이렇게 ii를 2로 나눴을 때 나머지가 0인 조건은 짝수인 조건을 의미한다.

그래서 0부터 9까지의 리스트 값 중에 짝수인 값만 담기게 된다.


문자열 이용한 list comprehensions

word1 = 'hello'
word2 = 'world'

result = [i+j for i in word1 for j in word2]

print(result)

Out:
['hw', 'ho', 'hr', 'hl', 'hd', 'ew', 'eo', 'er', 'el', 'ed', 'lw', 'lo', 'lr', 'll', 'ld',
'lw', 'lo', 'lr', 'll', 'ld', 'ow', 'oo', 'or', 'ol', 'od']

되게 정신 없는 결괏값이 나왔다.

리스트 안에 for문이 두 개 들어간 구조인데, 이중 for문으로 이해하면 좋을 것 같다.

word1의 'h'가 고정되어 있는 동안 word2의 'w', 'o', 'r', 'l', 'd' 가 나와서 합쳐지고 (i+ji+j이기 때문에)

그 다음에 'e'가 나오고, 끝날 때까지 반복되는 구조이다.

이중 for문을 사용했을 때, 같은 출력값을 같는 코드

word1 = 'hello'
word2 = 'world'
result = []

for i in word1:
    for j in word2:
        result.append(i+j)
        
print(result)

실행값은 같으므로 생략


filter 추가

이번엔 i랑 j가 같다면 list에 추가하지 않겠다는 조건문을 넣은 list comprehensions를 짜보겠다.

case1 = ['A', 'B', 'C']
case2 = ['D', 'E', 'A']
result = [i+j for i in case1 for j in case2]
print(result)

Out:
['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']

위의 코드와 아래 실행값은 'hello', 'world'를 이용한 것과 같은 경우이니 이해가 될 것이라 생각한다!

여기서 추가할 것은 조건을 넣어 filter 기능을 사용할 것이다.

case1 = ['A', 'B', 'C']
case2 = ['D', 'E', 'A']
result = [i+j for i in case1 for j in case2 if not (i==j)]
print(result)

Out:
['AD', 'AE', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']

그러면 이제 바로 위의 실행값과 비교해보면 i==ji==j인 부분인 'AA'의 값이 삭제되었다. 조건을 만족하기 때문에 filtering 되었다.

해당 result 를 sort() 해보면 더 비교가 빠를 듯 하다.

['AA', 'AD', 'AE', 'BA', 'BD', 'BE', 'CA', 'CD', 'CE']

['AD', 'AE', 'BA', 'BD', 'BE', 'CA', 'CD', 'CE']

여기서 한 실수 🙂

sort()를 한 다음에 출력해야 결괏값이 나온다.

대신 sort()를 한 것을 새 변수에 담아주진 않아도 된다.

👇 참고

result.sort()
print(result)

two dimensional list로 변환하기

words = 'The quick brown fox jumps over the lazy dog'.split()
# 공백을 기준으로 나눠서 list 로 저장

print("words 값:", words)

stuff = [[w.upper(), w.lower(), len(w)] for w in words]

# list 의 각 elements들을 대문자 , 소문자 , 길이로 변환하여 two dimensional list 로 변환

print('Stuff 값: ', stuff)

Out:
words 값: ['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

Stuff 값: [['THE', 'the', 3], ['QUICK', 'quick', 5], ['BROWN', 'brown', 5], ['FOX', 'fox', 3], ['JUMPS', 'jumps', 5], ['OVER', 'over', 4], ['THE', 'the', 3], ['LAZY', 'lazy', 4], ['DOG', 'dog', 3]]

개인적으로 한 번에 이해가 안 갔던 코드들...

하나씩 뜯어보면

words에 문자열을 split()으로 나눠준다. 그러면 공백을 기준으로 값들이 잘려서 리스트에 담기게 된다.

이제 stuff 변수에 넣는 코드를 보면

큰 리스트 [ ] 안에 [w.upper(), w.lower(), len(w)] 이 리스트가 들어있다.

그리고 뒤에 for w in words의 코드가 적혀 있다.

words의 리스트에서 나오는 하나씩 값 중 첫 번째 단어(값)는 대문자로 바꿔주고(upper), 두 번째 단어(값)는 소문자로 바꿔주고(lower), 세 번째 단어(값)은 길이를 재서(len) 하나의 리스트 안에 담아준다.

그렇게 리스트 안에 리스트가 들어가는 이중 리스트 구조가 만들어진다.

이를 two dimensional list라고도 한다. 2차원으로 이루어졌기 때문이다!

그러면 stuff란 변수 안에 이중 리스트를 할당해주었으니, for문을 이용해서 마지막으로 하나씩 뽑아서 보겠다!

# 위 코드에 이어서
for i in stuff:
	print(i)

Out:
['THE', 'the', 3]['QUICK', 'quick', 5]
['BROWN', 'brown', 5]['FOX', 'fox', 3]
['JUMPS', 'jumps', 5]['OVER', 'over', 4]
['THE', 'the', 3]['LAZY', 'lazy', 4]
['DOG', 'dog', 3]

이렇게 리스트가 하나씩 차례대로 출력되고 있다.

리스트 안의 리스트도 인덱스 0, 1, 2, ... 의 순서를 갖고 튀어나오게 된다.

오늘은 list comprehension에 대해 공부했다. 후후.

파이팅!

Reference

🔗 머신러닝을 위한 파이썬 강의

무료 강의입니다! 강추!

profile
미남이 귀엽죠

0개의 댓글