데이터 카드를 여러 개 저장하고 이를 효율적으로 관리하기 위해서는 DataCard
객체를 리스트로 관리하고, 특정 조건에 따라 카드를 검색하는 기능이 필요합니다. 이를 구현하기 위해 DataCardList
클래스를 만들고, 이 클래스에 데이터를 저장하고 검색하는 기능을 추가할 수 있습니다.
설계
DataCardList
클래스: 여러DataCard
객체를 리스트로 저장하고, 검색 기능을 포함하는 클래스입니다.- 검색 기능: 특정 속성 값 또는 카드 이름을 기준으로 카드를 검색할 수 있는 메서드를 추가합니다. 예를 들어,
name
을 기준으로 카드를 찾거나, 특정 속성(예:attack
)이 일정 값 이상인 카드를 찾을 수 있습니다.
예제 코드
class DataCard(dict):
def __init__(self, name, description, attributes=None):
"""
name: 카드의 이름
description: 카드에 대한 설명
attributes: 카드의 속성 (딕셔너리 형태)
"""
super().__init__()
self['name'] = name
self['description'] = description
self['attributes'] = attributes if attributes is not None else {}
def add_attribute(self, key, value):
"""카드에 새로운 속성을 추가"""
self['attributes'][key] = value
def get_attribute(self, key):
"""특정 속성 값을 조회"""
return self['attributes'].get(key, 'Attribute not found')
def __repr__(self):
"""카드의 간단한 정보를 출력"""
return f"DataCard(name={self['name']!r}, description={self['description']!r}, attributes={self['attributes']})"
class DataCardList:
def __init__(self):
"""DataCard 객체들을 저장하는 리스트"""
self.cards = []
def add_card(self, card):
"""리스트에 새 카드 추가"""
if isinstance(card, DataCard):
self.cards.append(card)
else:
raise ValueError("Only DataCard instances can be added")
def search_by_name(self, name):
"""카드 이름으로 검색"""
return [card for card in self.cards if card['name'] == name]
def search_by_attribute(self, key, value):
"""카드 속성 값으로 검색 (정확히 일치하는 속성 값)"""
return [card for card in self.cards if card.get('attributes', {}).get(key) == value]
def search_by_attribute_range(self, key, min_value=None, max_value=None):
"""
속성 값의 범위로 검색 (min_value 이상, max_value 이하)
"""
result = []
for card in self.cards:
attr_value = card.get('attributes', {}).get(key)
if attr_value is not None:
if (min_value is None or attr_value >= min_value) and (max_value is None or attr_value <= max_value):
result.append(card)
return result
def __repr__(self):
"""리스트의 모든 카드 정보 출력"""
return f"DataCardList({self.cards})"
# 예제 사용
# 데이터 카드 생성
card1 = DataCard(
name="Magic Card",
description="A powerful magic card.",
attributes={'attack': 10, 'defense': 8, 'mana_cost': 5}
)
card2 = DataCard(
name="Warrior Card",
description="A brave warrior card.",
attributes={'attack': 15, 'defense': 12, 'mana_cost': 7}
)
card3 = DataCard(
name="Healing Card",
description="A card with healing abilities.",
attributes={'heal': 20, 'mana_cost': 4}
)
# 데이터 카드 리스트 생성
card_list = DataCardList()
card_list.add_card(card1)
card_list.add_card(card2)
card_list.add_card(card3)
# 카드 이름으로 검색
print("Name search - 'Warrior Card':")
print(card_list.search_by_name("Warrior Card")) # Warrior Card 찾기
# 특정 속성으로 검색 (정확히 일치하는 값)
print("\nAttribute search - 'mana_cost' == 5:")
print(card_list.search_by_attribute('mana_cost', 5)) # 마나 비용이 5인 카드 찾기
# 속성 범위로 검색
print("\nAttribute range search - 'attack' between 10 and 15:")
print(card_list.search_by_attribute_range('attack', min_value=10, max_value=15)) # 공격력이 10 이상 15 이하인 카드 찾기
코드 설명
DataCard
클래스: 이전에 정의한 카드 데이터 모델입니다. 각 카드는 이름(name
), 설명(description
), 속성(attributes
)을 가집니다. 속성은 딕셔너리 형태로 저장됩니다.DataCardList
클래스:- 이 클래스는 여러
DataCard
객체를 리스트로 저장하는 역할을 합니다. add_card(card)
:DataCard
객체를 리스트에 추가합니다. 추가하려는 객체가DataCard
클래스의 인스턴스가 아닌 경우, 예외를 발생시킵니다.search_by_name(name)
: 카드의 이름으로 검색합니다. 주어진 이름과 정확히 일치하는 카드를 리스트로 반환합니다.search_by_attribute(key, value)
: 주어진 속성 키와 값으로 카드를 검색합니다.search_by_attribute_range(key, min_value, max_value)
: 주어진 속성의 값을 기준으로 범위 내에 속하는 카드를 검색합니다. 최소값(min_value
)과 최대값(max_value
)을 지정할 수 있으며, 범위 필터링이 가능합니다.
- 이 클래스는 여러
검색 기능:
- 이름으로 검색하는 기능을 통해 정확히 일치하는 카드를 찾습니다.
- 특정 속성의 값을 기준으로 카드를 찾을 수 있습니다(예: 마나 비용이 5인 카드).
- 속성 값의 범위를 기준으로 카드를 검색할 수 있습니다(예: 공격력이 10 이상, 15 이하인 카드).
실행 결과
Name search - 'Warrior Card':
[DataCard(name='Warrior Card', description='A brave warrior card.', attributes={'attack': 15, 'defense': 12, 'mana_cost': 7})]
Attribute search - 'mana_cost' == 5:
[DataCard(name='Magic Card', description='A powerful magic card.', attributes={'attack': 10, 'defense': 8, 'mana_cost': 5})]
Attribute range search - 'attack' between 10 and 15:
[DataCard(name='Magic Card', description='A powerful magic card.', attributes={'attack': 10, 'defense': 8, 'mana_cost': 5}),
DataCard(name='Warrior Card', description='A brave warrior card.', attributes={'attack': 15, 'defense': 12, 'mana_cost': 7})]
확장 가능성
이 구조를 기반으로 다양한 기능을 추가할 수 있습니다:
- 정렬 기능: 특정 속성을 기준으로 카드들을 정렬하는 기능.
- 필터링: 여러 속성을 기준으로 필터링하는 기능.
- 카드 업데이트: 특정 카드를 찾아 그 속성을 업데이트하거나 삭제하는 기능.
이와 같은 방식으로 DataCard
모델과 리스트 관리 클래스를 확장하여 더 복잡한 데이터 모델을 쉽게 구현할 수 있습니다.
'데이터 카드 자료구조' 카테고리의 다른 글
[데이터카드 자료구조] 문헌정보학에서 파이썬을 활용한 데이터 구조와 처리 (5) | 2024.10.21 |
---|---|
[데이터 카드 자료구조] 시뮬레이션 분야의 데이터 카드(Data Card) (1) | 2024.10.19 |
[데이터카드 자료구조] 딕셔너리 상속 데이터카드 클래스 (12) | 2024.10.17 |
[데이터카드 자료구조] 데이터 카드, 카드 리스트, 카드 덱 자료구조 (4) | 2024.10.17 |
[데이터카드 자료구조] 데이터 카드 모델의 응용 분야 1 (10) | 2024.10.17 |