[Python] Comprehension

3 minute read

python-version-3.7.1

Comprehension

  • List Comprehension

  • Set Comprehension

  • Dictionary Comprehension


List Comprehension

  • for 반복문을 활용한다.

  • 리스트를 빠르고 간결하게 작성할 수 있다.

  • 조건문을 사용가능하다.


Practice

[i for i in range(1, 10+1)]

>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

["string" for i in range(3)]

>>> ['string', 'string', 'string']

[i for i in range(1, 10+1) if i % 2 == 0]

>>> [2, 4, 6, 8, 10]

[i for i in range(1, 10+1) if i % 2 == 0 or i % 7 == 0]

>>> [2, 4, 6, 7, 8, 10]


Practice 2

2의 배수는 “k2”, 7의 배수는 “k7” 라는 문자열로 바꿔서 가진 b 라는 새로운 리스트를 만들어보겠다.

b = [] # 빈 리스트 b를 선언해둔다.
for i in a :

    if i % 2 == 0:  # 2의 배수인 경우 'k2'을 리스트 b에 추가한다.
        b.append('k2')

    elif i % 7 == 0:  # 7의 배수인 경우 'k7'를 리스트 b에 추가한다.
        b.append('k7')

    else:  # 위의 조건을 제외한 모든 경우는 i 를 리스트 b에 추가한다.
        b.append(i)
print(b)

>>> [1, 'k2', 3, 'k2', 5, 'k2', 'k7', 'k2', 9, 'k2']

위의 코드를 List Comprehension 을 활용하여 변환해보겠다.

['k2' if i % 2 == 0 else 'k7' if i % 7 == 0 else i for i in a]

>>> [1, 'k2', 3, 'k2', 5, 'k2', 'k7', 'k2', 9, 'k2']

이러한 조건에서의 List Comprehension 은 삼항연산자와 동일하다.
다만 for 반복문이 맨뒤에 온다는 것만 유의하자.


중첩 Comprehension

Example

for i in range(1,3+1):
    for j in range(11, 13+1):
        print(i,j)

>>> 1 11
>>> 1 12
>>> 1 13
>>> 2 11
>>> 2 12
>>> 2 13
>>> 3 11
>>> 3 12
>>> 3 13


위와같은 이중 반복문을 아래와 같이 작성 가능하다.

[print(i, j) for i in range(1, 3+1) for j in range(11, 13+1)]

이렇게 작성될 경우 가독성이 떨어질 수 있으므로 아래와 같이 줄바꿈을 줄 수 있다.

[(i, j)
    for i in range(1, 3+1)
        for j in range(11, 13+1)]



Set Comprehension

{i for i in range(1,10 + 1)}{1,2,3,4,5,6,7,8,9,10}

  • 사용문법은 List Comprehension 과 동일하다. (대신 {.} 으로 자료를 감싼다.)
  • Set 자료형은 unordered → 각 요소들의 순서가 랜덤하게 리턴된다.
  • 중복값은 제외하여 리턴된다.



Dictionary Comprehension

ex = {"name" : "Bruce", "class" : "A", "number" : "1", "hobby" : "Reading books"} # ex로 정의된 딕셔너리 자료형 작성
ex.items()  # ex 딕셔너리 자료형이 가지고 있는 Key, Value 값 모두 반환

>>> dict_items([('name', 'Bruce'), ('class', 'A'), ('number', '1'), ('hobby', 'Reading books')])

new = {val:key for key,val in ex.items()}  # Key와 Value가 서로 바뀐 new 딕셔너리 생성
new

>>> {'1': 'number', 'A': 'class', 'Bruce': 'name', 'Reading books': 'hobby'}

딕셔너리 ex 의 Key 와 Value가 반대가 되고, 순서가 랜덤하게 바뀌었다.(unordered)
,가 쓰인 key,valin 뒤에 쓰인 값을 받는 값, val:key는 리턴할 값을 의미한다.
ex.items()의 값들을 key,val 이라는 리스트로 받아서 val:key로 리턴시켜 자료를 구성하는 것이다.
keyval은 다른 변수로 바꿔도 전혀 문제없다.

new = {b:a for a,b in ex.items()}
new

>>> {'1': 'number', 'A': 'class', 'Bruce': 'name', 'Reading books': 'hobby'}

만약 조금 응용해본다면 이런식으로도 바꿀 수 있다.

new = {b:"example" for a,b in ex.items()}
new

>>> {'1': 'example','A': 'example','Bruce': 'example','Reading books': 'example'}

이번엔 range()함수를 활용해보겠다.

{a : a * 10 for a in range(1, 10+1)}  # 1~10의 요소를 가진 range객체에서 변수 a로 하나씩 받아 a : a * 10 으로 리턴

>>> {1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70, 8: 80, 9: 90, 10: 100}

range함수로 만들어진 iterable객체 요소를 순서대로 변수 a가 받아 Key값은 a로, Value 값은 a * 10 으로 나타난 것이다.

여기에 조건을 추가해보겠다.

{a : a * 10 for a in range(1, 10+1) if a % 2 == 0}  # 2의 배수인 경우만 a : a * 10 리턴

>>> {2: 20, 4: 40, 6: 60, 8: 80, 10: 100}

Leave a comment