고급 데이터 구조
- 고급 데이터 구조의 중요성
- 코드의 가독성과 효율성 향상
- 복잡한 데이터 처리 작업 간소화
- 파이썬에서의 리스트 컴프리헨션, 딕셔너리 컴프리헨션, 집합의 활용
- 파이썬의 강력한 기능으로, 다른 언어에서는 찾아보기 힘든 특징
- 데이터 과학, 웹 개발 등 다양한 분야에서 활용
1. 리스트 컴프리헨션
- 리스트 컴프리헨션은 기존의 리스트를 기반으로 새로운 리스트를 생성하는 간결한 방법입니다.
# 기본 구조
[표현식 for 항목 in 반복가능객체 if 조건문]
# 기본 예시
squares = [x**2 for x in range(10)] # 0-9
print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 조건문 추가
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # [0, 4, 16, 36, 64]
#중첩 리스트 컴프리핸션
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[[1, 2, 3]
[4, 5, 6]
[7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 행 row
# 열 col
2. 딕셔너리 컴프리헨션
- 딕셔너리 컴프리헨션은 키-값 쌍으로 이루어진 딕셔너리를 생성하는 간결한 방법입니다.
#기본 구조
{키_표현식: 값_표현식 for 표현식 in 반복가능객체}
#예시
squares_dict = {x: x**2 for x in range(5)} # 0-4
print(squares_dict) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
#조건문 추가
even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0} # 0-9
print(even_squares_dict) # {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
3. 집합(set)의 고급 활용
- 집합은 중복을 허용하지 않는 순서 없는 컬렉션입니다. 집합 연산과 컴프리헨션을 활용하여 데이터를 효율적으로 처리할 수 있습니다.
set1 = {1, 2, 3, 4, 5}
# set1 = set([1, 2, 3, 4, 5]) -> 직접 set으로 선언하기
set2 = {4, 5, 6, 7, 8}
print(set1 | set2) # 합집합: {1, 2, 3, 4, 5, 6, 7, 8}
print(set1 & set2) # 교집합: {4, 5}
print(set1 - set2) # 차집합: {1, 2, 3}
#집합 컴프리헨션
even_squares_set = {x**2 for x in range(10) if x % 2 == 0}
print(even_squares_set) # {0, 64, 4, 36, 16}
4. 문제 풀기
1) 주어진 문자열에서 각 문자의 출현 빈도를 계산하는 딕셔너리 컴프리헨션을 작성하세요.
text = "hello world"
text = "hello world"
mode = {i: text.count(i) for i in set(text)}
print(mode) #{'l': 3, 'e': 1, 'w': 1, ' ': 1, 'o': 2, 'r': 1, 'h': 1, 'd': 1}
2) 1부터 100까지의 숫자 중 3의 배수이면서 5의 배수인 숫자만을 포함하는 리스트를 리스트 컴프리헨션으로 생성하세요.
drainage = [x for x in range(1,100) if x % 15 == 0]
print(drainage) #[15, 30, 45, 60, 75, 90]
3) 두 개의 리스트가 주어졌을 때, 이를 딕셔너리로 결합하는 딕셔너리 컴프리헨션을 작성하세요.
keys = ['a', 'b', 'c']
values = [1, 2, 3]
keys = ['a', 'b', 'c']
values = [1, 2, 3]
key_value = {keys[x]:values[x] for x in range(3)}
print(key_value) #{'a': 1, 'b': 2, 'c': 3}
4) 주어진 리스트에서 중복을 제거하고 고유한 요소만을 포함하는 새로운 리스트를 생성하세요. (힌트: set 사용)
original_list = [1, 2, 2, 3, 4, 4, 5]
original_list = [1, 2, 2, 3, 4, 4, 5]
set_origin = set(original_list)
print(set_origin) #{1, 2, 3, 4, 5}
5) 2차원 리스트를 생성하는 리스트 컴프리헨션을 작성하세요. (예: 5x5 행렬)
matrix = [[i * j for j in range(5)] for i in range(5)]
print(matrix)
#[[0, 0, 0, 0, 0],
[0, 1, 2, 3, 4],
[0, 2, 4, 6, 8],
[0, 3, 6, 9, 12],
[0, 4, 8, 12, 16]]
6)주어진 문자열 리스트에서 길이가 5 이상인 문자열만 대문자로 변환하여 새로운 리스트를 만드세요.
string_list = ['apple', 'banana', 'pear', 'grape', 'kiwi']
string_list = ['apple', 'banana', 'pear', 'grape', 'kiwi']
five_list = [x for x in string_list if len(x) >= 5]
print(five_list) #['apple', 'banana', 'grape']
7) 두 개의 집합 A와 B가 주어졌을 때, 두 집합의 대칭 차집합을 구하세요.
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
print((set_a - set_b) | (set_b -set_a)) #{1, 2, 3, 6, 7, 8}
8) 1부터 10까지의 숫자에 대해 각 숫자의 제곱을 값으로 갖는 딕셔너리를 생성하세요.
oneten = [x**2 for x in range(1,11)]
print(oneten) #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
9) 주어진 리스트에서 짝수만 선택하여 그 제곱값을 가진 새로운 리스트를 생성하세요.
given_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
given_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evensquare = [x**2 for x in given_list if x %2 ==0]
print(evensquare) #[4, 16, 36, 64, 100]
10) 여러 개의 리스트가 주어졌을 때, 이들을 하나의 리스트로 평탄화하는 함수를 작성하세요.
lists = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
lists = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
one_list = [y for x in lists for y in x]
print(one_list) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
'Python 문제 풀기' 카테고리의 다른 글
[Python 문제풀기] (3) | 2024.12.30 |
---|---|
[Python 문제 풀기] (3) | 2024.12.24 |
[Python 문제 풀기] (2) | 2024.12.16 |
[Python 라이브러리로 데이터 분석하기] (1) | 2024.12.04 |
[Python 문제풀기 함수와 클래스 사용해보기] (2) | 2024.12.02 |