Full keyword report prints cardlist for each keyword

This commit is contained in:
henriquenakashima 2020-11-29 18:30:36 -05:00
parent 5cec2e8e24
commit 0a3cf8d657
2 changed files with 34 additions and 19 deletions

View file

@ -8,4 +8,6 @@ if __name__ == '__main__':
cube_list = cube_json.load_cube_from_csv('cube_csvs/TheElegantCube_2020-11-17_5.0.4.csv', {'core'})
cube_json_filename = cube_json.create_cube_json(cube_list, 'cubes/TheElegantCube_2020-11-17_5.0.4.json')
keyword_dict = keyword_stats.keyword_count(cube_json_filename)
keyword_stats.keyword_report(keyword_dict)
# keyword_stats.keyword_report(keyword_dict)
keyword_stats.keyword_report_full(keyword_dict)

View file

@ -1,6 +1,10 @@
import json
def get_keywords(card):
from collections import defaultdict
from typing import Dict, Iterable, List, Tuple
def get_keywords(card: Dict) -> List[str]:
if 'keywords' in card.keys():
return card['keywords']
elif 'card_faces' in card:
@ -13,26 +17,35 @@ def get_keywords(card):
return []
def keyword_count(filename):
# Maps keywords to a list of cards containing them
KeywordDict = Dict[str, List[str]]
def keyword_count(filename: str) -> KeywordDict:
# json file must contain a list of Scryfall card objects
f = open(filename, encoding='utf8')
d = json.load(f)
keywords = []
with open(filename, encoding='utf8') as f:
d = json.load(f)
k_dict = defaultdict(list)
for card in d:
keywords += get_keywords(card)
f.close()
k_unique = set(keywords)
k_dict = {}
for keyword in k_unique:
k_dict[keyword] = keywords.count(keyword)
for keyword in get_keywords(card):
k_dict[keyword].append(card['name'])
return k_dict
def keyword_report(k_dict):
k_lists = []
for keyword in k_dict:
k_lists += [[k_dict[keyword], keyword]]
k_lists = sorted(k_lists, reverse=True)
for n, keyword in k_lists:
print(keyword, n)
def keyword_report(k_dict: KeywordDict) -> None:
for keyword, cards in _rank_keywords_descending(k_dict):
print(keyword, len(cards))
print(f'\nTotal unique keywords: {len(k_dict)}')
def keyword_report_full(k_dict: KeywordDict) -> None:
for keyword, cards in _rank_keywords_descending(k_dict):
print(f'{keyword} ({len(cards)})')
for card in cards:
print(f' {card}')
print()
print(f'\nTotal unique keywords: {len(k_dict)}')
def _rank_keywords_descending(k_dict: KeywordDict) -> Iterable[Tuple[str, List[str]]]:
return sorted(k_dict.items(), key=lambda kv: len(kv[1]), reverse=True)