파이썬 and 연산자와 & 연산자의 미묘한 차이

개발공부를해보자·2025년 2월 28일

공부 정리

목록 보기
23/32

집합 관련 함수, 연산

  • 먼저 간단히 집합 관련 함수, 연산을 정리해본다.
# 1. 집합 생성
a = {1, 2, 3, 4}
b = set([3, 4, 5, 6])  # 리스트 → 집합 변환
c = set((7, 8, 9))     # 튜플 → 집합 변환
d = set("hello")       # 문자열 → 집합 변환 (중복 제거)
e = set()              # 빈 집합 (주의: {}는 빈 딕셔너리)

print(a, b, c, d, e)

# 2. 집합 연산자
A = {1, 2, 3}
B = {2, 3, 4}

print(A & B)  # {2, 3} (교집합)
print(A | B)  # {1, 2, 3, 4} (합집합)
print(A - B)  # {1} (차집합)
print(A ^ B)  # {1, 4} (대칭 차집합)

# 3. 집합 메서드
s = {1, 2, 3}
s.add(4)          # {1, 2, 3, 4}
s.remove(2)       # {1, 3, 4}, 2가 없었다면 에러 발생
s.discard(10)     # 10 삭제 시도, 없지만 에러 없음
s.update([5, 6])  # {1, 3, 4, 5, 6}
print(s.pop())    # 임의의 원소 제거 후 반환
s.clear()         # 빈 집합이 됨

# 4. 부분 집합 & 상위 집합
A = {1, 2}
B = {1, 2, 3}
C = {3, 4}

print(A.issubset(B))  # True (A는 B의 부분집합)
print(B.issuperset(A))  # True (B는 A의 상위집합)
print(A.isdisjoint(C))  # True (A와 C는 공통 원소 없음)

# 5. 집합과 리스트/튜플 변환
lst = [1, 2, 2, 3, 4]
s = set(lst)  # {1, 2, 3, 4} (중복 제거)
lst2 = list(s)  # [1, 2, 3, 4]
tpl = tuple(s)  # (1, 2, 3, 4)

# 6. 중복 제거
nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = list(set(nums))  # [1, 2, 3, 4, 5]
print(unique_nums)

📌 집합 연산 및 메서드 정리

기능연산자 / 메서드예제
집합 생성{} 또는 set(iterable)set([1, 2, 3])
교집합A & B 또는 A.intersection(B){1, 2, 3} & {2, 3, 4}{2, 3}
합집합A | B 또는 A.union(B){1, 2, 3} | {2, 3, 4} → {1, 2, 3, 4}
차집합A - B 또는 A.difference(B){1, 2, 3} - {2, 3, 4}{1}
대칭 차집합A ^ B 또는 A.symmetric_difference(B){1, 2, 3} ^ {2, 3, 4}{1, 4}
원소 추가.add(x)s.add(5)
원소 삭제.remove(x), .discard(x), .pop()s.remove(2)
부분집합 확인.issubset(B){1, 2}.issubset({1, 2, 3}) → True
상위집합 확인.issuperset(B){1, 2, 3}.issuperset({1, 2}) → True
공통 원소 확인.isdisjoint(B){1, 2}.isdisjoint({3, 4}) → True

and, or, & 연산자

# 1. 논리 연산자 `and`, `or`의 동작 방식

# 논리 연산자 `and`
# A and B -> A가 False이면 A 반환, A가 True이면 B 반환
print([1, 2] and [2])  # [2] (첫 번째가 True이므로 두 번째 값 반환)
print([] and [1])      # [] (첫 번째가 False이므로 그대로 반환)
print([1] or [1, 2])   # [1] (첫 번째가 True이므로 그대로 반환)

# 논리 연산자 `or`
# A or B -> A가 True이면 A 반환, A가 False이면 B 반환
print([] or [1])       # [1] (첫 번째가 False이므로 두 번째 값 반환)
print([1] or [2, 3])   # [1] (첫 번째가 True이므로 그대로 반환)

# 2. & 연산자의 두 가지 용도 (비트 연산 & 집합 연산)

# 2-1. 비트 연산 (Bitwise AND)
# 두 숫자의 비트 단위 AND 연산
print(5 & 3)  # 1  (5: 101, 3: 011 → 001)
print(7 & 2)  # 2  (7: 111, 2: 010 → 010)

# Boolean 값도 비트 연산 가능 (True는 1, False는 0으로 처리)
print(True & True)   # 1 (1 & 1 = 1)
print(True & False)  # 0 (1 & 0 = 0)
print(False & False) # 0 (0 & 0 = 0)

# 2-2. 집합 연산 (Set Intersection)
# & 연산자를 사용하여 두 집합의 교집합 구하기
A = {1, 2, 3}
B = {2, 3, 4}

print(A & B)  # {2, 3} (A와 B의 공통 원소)
print({4, 9, 5} & {9, 4, 8})  # {4, 9}
연산자용도동작 방식예제결과
and논리 연산AFalse이면 A 반환, True이면 B 반환[1, 2] and [2][2]
[] and [1][]
or논리 연산ATrue이면 A 반환, False이면 B 반환[1] or [1, 2][1]
[] or [1][1]
&비트 연산두 정수의 비트 AND 연산 수행5 & 31 (101 & 011 = 001)
True & False0 (1 & 0 = 0)
&집합 연산두 집합의 교집합을 반환{1, 2, 3} & {2, 3, 4}{2, 3}
{4, 9, 5} & {9, 4, 8}{4, 9}
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글