検索ガイド -Search Guide-

単語と単語を空白で区切ることで AND 検索になります。
例: python デコレータ ('python' と 'デコレータ' 両方を含む記事を検索します)
単語の前に '-' を付けることで NOT 検索になります。
例: python -デコレータ ('python' は含むが 'デコレータ' は含まない記事を検索します)
" (ダブルクオート) で語句を囲むことで 完全一致検索になります。
例: "python data" 実装 ('python data' と '実装' 両方を含む記事を検索します。'python data 実装' の検索とは異なります。)
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
  • ただいまサイドメニューのテスト中/ただいまサイドメニューのテスト中
>>
python_coding_challenge

【 Python coding challenge 】Gutenberg Project からダウンロードする実際の古典を題材に、登場人物インデックスを作成しよう! Python Programming Interview の準備にもなります 投稿一覧へ戻る

Published 2020年8月3日21:08 by mootaro23

SUPPORT UKRAINE

- Your indifference to the act of cruelty can thrive rogue nations like Russia -

今回の課題は、実際の小説 ( eBook ) の登場人物が何ページ目に登場しているか、という登場人物インデックスの作成です。


Gutenberg Project という著作権の切れた古典をデジタル化して提供してくれているサイトからテキストをダウンロードし、任意の行数を含むページとして区切った上でインデックス作成を行います。


最終的な出力結果は次のようになります。


Accountant : p2
aunt : p7, p10, p24, p57, p65, p68
brickmaker : p23, p59
cannibals : p32
Fresleven : p7, p8
helmsman : p42, p43, p48
intended : p30, p65
Kurtz : p17, p20, p21, p22, p23, p24, p25, p26, p29, p30, p31, p33, p35, p36, p40, p41, p44, p45, p46, p47, p48, p49, p50, p51, p52, p53, p54, p55, p56, p58, p59, p60, p61, p62, p64, p65, p66, p67, p68, p69, p70, p72, p75
manager : p19, p22, p23, p24, p26, p28, p29, p30, p31, p33, p36, p40, p44, p46, p48, p49, p50, p54, p57, p59, p65, p66, p68, p72
Marlow : p2, p3, p4, p6, p7, p26, p32, p45, p75
mistress : p4
pilgrims : p21, p22, p24, p25, p27, p28, p32, p33, p35, p36, p37, p38, p39, p40, p42, p48, p50, p57, p58, p62, p64, p65, p66, p67
Russian : p50, p51, p54, p56, p57, p59



今回利用した本は、Joseph Conrad 著の Heart of Darkness です。


制限時間: 70 分


課題:

1: 対象の eBook はテキスト形式のものを "http://www.gutenberg.org/cache/epub/526/pg526.txt" からダウンロードしてください。

2: 改行文字までを 1 行とし、今回は 45 行で 1 ページが構成されているものとします。

3: 構成した各ページに CHARACTERS クラスリストで指定した登場人物が含まれていた場合、登場人物ごとにそのページ番号を保存してください。

4: 最終的に上に示したようなインデックスを表示してください。

5: 登場人物のアルファベット順に表示します。同じ A で大文字と小文字で始まっているものが混在している場合であっても区別しません。

6: インデックスのページ番号には 'p' (小文字の p) を付けて表示してください。

7: __init__ メソッドと download_data メソッドは与えられていますが、変更してもかまいません。

8: 他の定義が与えられているメソッドを利用しても利用しなくても構いません。

9: requests モジュールはインストールするか、Python 組み込みの urllib モジュールを利用してください。




import math
from collections import defaultdict
import requests


class CreateCharacterIndex:

# 登場人物リスト:
# それぞれの人物ごとに登場しているページ番号を保存し、最終的にインデックスを作成する

CHARACTERS = ["Kurtz", "manager", "Russian", "pilgrims", "cannibals", "aunt", "brickmaker", "Accountant",
"helmsman", "mistress", "intended", "Marlow", "Fresleven"]


def __init__(self):
self.data = []
self.character_index = defaultdict(list)


def download_data(self, url):
"""
指定された URL のテキストファイルを取得し、改行文字で各要素に分けられたリストを作成、保存する。

:param url: 取得するファイルの URL
"""

res = requests.get(url)
if res.status_code != 200:
print("データが取得できませんでした")
return

self.data = res.text.splitlines()
self.make_index()


def get_page_content(self, lines_per_page=45, page_no=1):
"""
ダウンロードしたテキストから、任意の行数で構成される「ページ」を作出し、
page_no パラメータに相当するページのコンテンツを提供する。

:param lines_per_page: 1ページに含まれる行数。
:param page_no: 取得したいページ番号
:return: page_no ページに含まれるコンテンツ
"""

total_page = math.ceil(len(self.data) / lines_per_page)
...


def make_index(self):
"""
各ページを走査し、該当する登場人物が含まれていれば、それぞれの登場人物ごとにページ番号を保存する。
"""

pass


def print_index(self):
"""
{'登場人物A': [3, 16], '登場人物B': [11, 34, 36],...} という形式の辞書を整形して登場人物インデックスを表示する。

インデックスは大文字小文字を区別せず登場人物のアルファベット順表示とする。
登場するページ番号には p3, p16 のように先頭に 'p' の文字を付加すること。
"""

pass


url = "http://www.gutenberg.org/cache/epub/526/pg526.txt"

myindex = CreateCharacterIndex()
myindex.download_data(url)
myindex.print_index()



解答例は こちら へ。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -
【 Python coding challenge 】Gutenberg Project からダウンロードする実際の古典を題材に、登場人物インデックスを作成しよう! Python Programming Interview の準備にもなります【解答例】
【 Python Data Structures and Algorithms 】Python とデータ構造 ( data structure ) - linked list を実装してみよう! Linked List 実装 Python Programming Interview 模擬問題
Python coding challenge [解説編]: Basics of Graph Theory - グラフ理論の基礎総復習 - Python interview でも取り上げられます
【Python 雑談・雑学 + coding challenge】シーケンス ( sequence ) における インデックス ( index ) を使った要素 1 つの取り出しと、スライス ( slice ) を利用した場合の取り出しの違いをちゃんと理解していますか?
【 Effective Python, 2nd Edition 】組み込みタイプ ( built-in types ) を利用していてネストが深くなってきたらクラス ( class ) を作成する頃合いです、の巻
【 Effective Python, 2nd Edition + coding challenge 】プログラム開発のどの段階で並列処理 ( concurrency ) が必要になるのだろう? そのときどのようにリファクタリング ( refactoring ) していけばいいのだろう? を考えてみるシリーズ ( のはず ) 第1回
Python coding challenge - [Depth First Search (DFS) for Graph and Tree] パスを構成するノードの value の合計値が target と同じものを見つけよう!