From 0a3cf8d657ffbc5856f1506d67c94982a55f034e Mon Sep 17 00:00:00 2001 From: henriquenakashima Date: Sun, 29 Nov 2020 18:30:36 -0500 Subject: [PATCH] Full keyword report prints cardlist for each keyword --- analyze_cube_keywords.py | 4 +++- keyword_stats.py | 49 +++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/analyze_cube_keywords.py b/analyze_cube_keywords.py index 9a8b0e6..55d134c 100644 --- a/analyze_cube_keywords.py +++ b/analyze_cube_keywords.py @@ -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) diff --git a/keyword_stats.py b/keyword_stats.py index 69ce5fe..8a5e29c 100644 --- a/keyword_stats.py +++ b/keyword_stats.py @@ -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)