λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
🀷🏼‍♀️ Etc.../- C, C++, Python, Android

Python μ…‹(Set)의 λͺ¨λ“  것

by Wonit 2019. 12. 2.

Set μ…‹

 

셋은 ν‚€λ§Œ 남은 λ”•μ…”λ„ˆλ¦¬μ™€ κ°™λ‹€. λ”•μ…”λ„ˆλ¦¬μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ ν‚€λŠ” μœ μΌν•΄μ•Όν•œλ‹€.


ν‚€λ₯Ό μ‚¬μš©ν•  λ•ŒλŠ” μ–΄λ–€ κ²ƒμ˜ μ‘΄μž¬μ—¬λΆ€λ§Œ νŒλ‹¨ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λ©° 킀에 μ–΄λ–€ 정보λ₯Ό μ²¨λΆ€ν•΄μ„œ κ·Έ κ²°κ³Όλ₯Ό μ–»κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.

 

μ…‹ μƒμ„±ν•˜κΈ° : set(), μ…‹μœΌλ‘œ νƒ€μž… λ³€ν™˜ν•˜κΈ° : set()

>> empty_set = set()
>> empty_set
set()

 

λ”•μ…”λ„ˆλ¦¬μ˜ νŠΉμ„±κ³Ό λ™μΌν•˜κ²Œ 셋은 μˆœμ„œκ°€ μ—†λ‹€.

 

기쑴에 μ‘΄μž¬ν•˜λ˜ 리슀트, νŠœν”Œ, λ”•μ…”λ„ˆλ¦¬λ‘œ μ€‘λ³΅λœ 값을 버린 셋을 생성할 수 μžˆλ‹€.

 

>>> set('letters')
{'e', 'r', 'l', 's', 't'}

 

와 같은 λŠλ‚ŒμœΌλ‘œ μ‚¬μš©λ˜λŠ”λ° μœ„μ—μ„œ 말 ν•œ μˆœμ„œκ°€ μ—†λ‹€λ₯Ό λ³΄μ—¬μ£ΌλŠ” κ°€μž₯ 쒋은 예 인것 κ°™λ‹€.

 

  • 리슀트
    리슀트둜 셋을 λ§Œλ“€μ–΄ 보자

    >>> list_data = ['hong', 'song', 'kang', 'hong']
    >>> set(list_data)
    {'song', 'kang', 'hong'}
  • νŠœν”Œ
    이제 νŠœν”Œλ‘œ 셋을 λ§Œλ“€μ–΄λ³΄μž

    >>> tuple_data = ('hong', 'song', 'kang', 'hong')
    >>> set(tuple_data)
    {'song', 'kang', 'hong'}
  • λ”•μ…”λ„ˆλ¦¬
    λ§ˆμ§€λ§‰μœΌλ‘œ λ”•μ…”λ„ˆλ¦¬λ‘œ 셋을 λ§Œλ“€μ–΄λ³΄μž.

    >>> dict_data = {'hong': 123, 'song':123, 'kang':123, 'hong':333}
    >>> dict_data
    {'hong': 333, 'song': 123, 'kang': 123}
    >>> set(dict_data)
    {'song', 'kang', 'hong'}

    λ”•μ…”λ„ˆλ¦¬λ₯Ό μ‚¬μš©ν•˜λ©΄ ν•˜λ‚˜ 염두해야할 게 μžˆλŠ”λ° λ”•μ…”λ„ˆλ¦¬λŠ” ν‚€λ§Œ μ…‹μœΌλ‘œ λ§Œλ“ λ‹€.

멀버가 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜κΈ° : in

 

νŒŒμ΄μ¬μ„ μ‚¬μš©ν•˜λ©΄μ„œ 1차적으둜 λ†€λžλ˜ 뢀뢄이닀. 정말 μ‹ κΈ°ν•˜κ²Œ 컴퓨터와 λŒ€ν™”ν•˜λŠ”μ€„ μ•Œμ•˜λŠ”λ° λ‹€μŒ 예제λ₯Ό 보자.

 

 

λ§Œμ•½ μŒμ‹ λͺ©λ‘μ„ λ§Œλ“€ λ•Œ ν•¨μœ  성뢄쀑 μ•Œλ ˆλ₯΄κΈ° 검사λ₯Ό ν•˜κΈ° μœ„ν•œ 셋을 λ§Œλ“ λ‹€κ³  ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μŒμ‹ 정보λ₯Ό μœ„ν•œ λ”•μ…”λ„ˆλ¦¬κ°€ μƒμ„±λœλ‹€.

>>> food = {'bibimbob':{'rice','namul'},
... 'bulgogi':{'meat','source'},
... 'gaejang':{'gae','source'}}
>>> food
{'bibimbob': {'namul', 'rice'}, 'bulgogi': {'source', 'meat'}, 'gaejang': {'source', 'gae'}}

 

 

μŒμ‹ 정보 λ”•μ…”λ„ˆλ¦¬κ°€ μƒμ„±λμœΌλ―€λ‘œ μ•Œλ ˆλ₯΄κΈ° 검사λ₯Ό μœ„ν•œ 셋을 λ§Œλ“€μ–΄λ³΄μž.


forλ¬Έκ³Ό if문이 λ‚˜μ˜€λŠ”λ° λ‹€μŒμ— λ°°μšΈκ±°μ§€λ§Œ 일단 λ‹€λ₯Έ μ–Έμ–΄μ˜ forκ³Ό if와 크게 λ‹€λ₯Όλ°” μ—†μœΌλ‹ˆ μ΄ν•΄ν•˜λ €ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

 

>>> for name, contents in food.items():
...     if 'source' in contents:
...             print(name)
    1. food.items()둜 λͺ¨λ“  킀와 값을 λΆˆλŸ¬μ™€μ„œ name, contents에 μ €μž₯ν•œλ‹€.
    1. sourceκ°€ λ“€μ–΄κ°„ κ°’μ˜ name을 좜λ ₯ν•œλ‹€.

μ΄λ ‡κ²Œ 되면 sourceκ°€ λ“€μ–΄κ°„ μŒμ‹μ΄ 좜λ ₯λ˜λŠ”λ° 정말 컴퓨터와 λŒ€ν™”ν•˜λŠ”κ²ƒ κ°™λ‹€λŠ” λŠλ‚Œμ„ 많이 λ°›κ²Œλœ μ˜ˆμ œμ˜€λ‹€.

μ½€λΉ„λ„€μ΄μ…˜κ³Ό μ—°μ‚°μž

 

μœ„μ™€ 같은 예제λ₯Ό μ‚¬μš©ν•˜κΈ° 전에 사싀 μ•Œμ•„μ•Ό ν•  뢀뢄이 μžˆμ§€λ§Œ, ν•™μŠ΅μ˜ 이해λ₯Ό 돕기 μœ„ν•΄ μƒλž΅ν–ˆλ‹€. 이제 맛보기λ₯Ό ν–ˆμœΌλ‹ˆ 본격적으둜 μ•Œμ•„λ³΄μž.

 

 

집합

 

 

사진은 μ€‘ν•™κ΅λ•Œ? μ΄ˆλ“±ν•™κ΅λ•Œ 배운 집합이닀. 집합은 λ‹€μŒκ³Ό 같이 ꡬ뢄할 수 μžˆλ‹€.

  • A와 Bλͺ¨λ“  뢀뢄을 λ‚˜νƒ€λ‚΄λŠ” 합집합.
  • A와 B의 곡톡적인 뢀뢄을 λ‚˜νƒ€λ‚΄λŠ” ꡐ집합
  • A와 B의 곡톡적인 뢀뢄을 λΊ€(합집합 - ꡐ집합) 차집합

 

이λ₯Ό μš°λ¦¬λŠ” μ•žμœΌλ‘œ μ…‹ κ°’μ˜ μ‘°ν•©(Combination) 이라고 μΉ­ν•  것이닀. 그럼 μ°¨λ‘€λŒ€λ‘œ μ•Œμ•„λ³΄μž!

 

 

일단 λ‹€μ‹œ μŒμ‹μ˜ μ£Ό μž¬λ£Œλ“€μ„ λ”•μ…”λ„ˆλ¦¬μ— 집어 λ„£μ–΄ 데이터λ₯Ό λ§Œλ“€κ³  κ·Έ 데이터λ₯Ό 가지고 ν•™μŠ΅ν•˜μž.

>>> food = {
... 'cheeze':{'milk', 'Fermentation'},
... 'bread':{'flour', 'Fermentation'},
... 'corn soup':{'corn', 'water', 'salt'}
... }
>>> food
{'cheeze': {'Fermentation', 'milk'}, 'bread': {'flour', 'Fermentation'}, 'corn soup': {'salt', 'corn', 'water'}}

ꡐ집합

Intersection이라고도 ν•˜κ³  컴퓨터 μ—°μ‚° ꡬ쑰인 & μ—°μ‚°(μ•°νΌμ„Όλ“œ) λ₯Ό μ‚¬μš©ν•œλ‹€. ꡐ집합을 μ΄μš©ν•˜μ—¬ μš°λ¦¬κ°€ μ›ν•˜λŠ” 값을 μ°ΎλŠ” λ‘œμ§μ„ κ΅¬ν˜„ν•΄λ³΄μž

 
μŒμ‹λ“€μ—μ„œ 발효(Fermentation)κ°€ 된 μŒμ‹μ„ 찾으렀면 λͺ¨λ“  ν•­λͺ©, 즉 food의 set()쀑 κ³΅ν†΅λœ λΆ€λΆ„(&)을 μ°Ύμ•„μ•Ό ν•œλ‹€.

 

>>> for name, contents in food.items():
...     if contents & {'Fermentation'}:
...             print(name)
...
cheeze
bread

이와 같이 &λ₯Ό μ΄μš©ν•΄μ„œ Fermentation이 μžˆλŠ” μŒμ‹μ„ μ°ΎλŠ” μ½”λ“œλ₯Ό 지 수 μžˆλ‹€.

 

 

그 런 데

 

λ§Œμ•½ & μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ μ›ν•˜λŠ” 값이 μ—†λ‹€λ©΄ μ–΄λ–»κ²Œ 될까??

>>> for name, contents in food.items():
...     if contents & {'rice'}:
...             print(name)
...
>>>

이와 같이 아무것도 μ—†λŠ” 셋을 λ°˜ν™˜ν•œλ‹€. μ΄λŠ” 논리적인 Falseλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

 

근데 μ΄λ ‡κ²Œ ꡐ집합을 찾을 λ•Œ λ§ˆλ‹€ 일일이 for name, contents in food.items(): if ... μ΄λΌλŠ” κΈ΄ μ½”λ“œλ₯Ό μž‘μ„±ν•  것인가?? 쑰금 더 κ°„κ²°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλŠ” 방법은 μ—†λŠ”κ°€?? λ°”λ‘œ λ‹€μŒ 배울 λ‚΄μš©μ΄ κ·Έ 것이 κ°€λŠ₯ν•˜κ²Œ ν•΄μ€€λ‹€.

 

 

intersection() μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°€λŠ₯ν•˜λ‹€!

 

κ°€λ²Όμš΄ ν…ŒμŠ€νŠΈλ₯Ό μœ„ν•΄ λ³€μˆ˜μ— μž„μ˜μ˜ 값을 μ €μž₯ν•΄μ„œ intersection()μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄λ³΄μž.

>> a = {1, 2}
>> b = {2, 3}
>> a.intersection(b)
{2}

 

정말 κ°„κ²°ν•΄ μ‘Œλ‹€. 이제 μœ„μ˜ 예제둜 ꡐ집합을 마무리 ν•΄λ³΄μž

 

>>> new_cheeze = food['cheeze']
>>> new_bread = food['bread']
>>> new_cheeze
{'Fermentation', 'milk'}
>>> new_bread
{'flour', 'Fermentation'}

# intersectino() μ—°μ‚°μž 이용
>>> new_cheeze.intersection(new_bread)
{'Fermentation'}

# & μ—°μ‚°μž 이용
>>> new_cheeze & new_bread
{'Fermentation'}

 

합집합

 

합집합은 Union이라고 ν•˜λ©° | μ—°μ‚°μžμ™€ union() μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄μ„œ μŒμ‹μ˜ λͺ¨λ“  성뢄을 좜λ ₯ν•΄ 보자!

 

 

λ°”λ‘œ μ‚¬μš©λ²•μ„ μ•Œλ €μ£Όμžλ©΄ μœ„μ˜ ꡐ집합과 μ™„μ „νžˆ λ™μΌν•œ ꡬ쑰λ₯Ό κ°–λŠ”λ‹€.

# | μ—°μ‚°μž 이용
>> a = {1, 2, 3}
>> b = {3, 4, 5}
>> a | b
{1, 2, 3, 4, 5}

#  union()ν•¨μˆ˜ 이용
>> a.union()
{1, 2, 3, 4, 5}

μœ„ μŒμ‹ 예제λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 직접 해보길 λ°”λž€λ‹€. μ‹€λ ₯이 정말 많이 늘 것이닀.

 

차집합

 

차집합은 difference() μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜λ©° - 기호λ₯Ό μ‚¬μš©ν•˜κΈ°λ„ ν•œλ‹€. λ˜ν•œ λ°”λ‘œ 예제둜 λ“€μ–΄κ°€λ³΄μž

 

# - μ—°μ‚°μž 이용
>> a = {1, 2, 3}
>> b = {3, 4, 5}
>> a - b
{1, 2, 4, 5}

#  difference() ν•¨μˆ˜ 이용
>> a.difference()
{1, 2, 4, 5}

 

이 외에도 μ΅μŠ€ν΄λ£¨μ‹œλΈŒ, μ„œλΈŒμ…‹, μŠˆνΌμ…‹, ν”„λ‘œνΌ μ„œλΈŒμ…‹μ΄ μžˆλŠ”λ° 좔후에 μ„€λ©ν•˜κ² λ‹€

 

λŒ“κΈ€