Python では pprint モジュールが提供されていて、ネストしているデータ構造を階層的に出力してくれます。
from pprint
import pprint
a = [1, 2, 3, 4, 5]
b = [1, [2, [5, 6], 3], 4]
pprint(a, indent=4, width=15)
# [1, 2, 3, 4, 5]
pprint(b, indent=4, width=15)
# [ 1,
# [ 2,
# [5, 6],
# 3],
# 4]
問題 ( 制限時間: 60 分 ):pprint と同様の機能の実装です ( pprint() を使っちゃダメですよ )。
ただし、実装を簡略化するために、list から成るネスト構造だけを対象にします。
出力は以下の通りです。
a = [1, 2, 3, 4, 5]
my_pretty_print(a)
# [1, 2, 3, 4, 5]
b = [1, [2, [5, 6], 3], 4]
my_pretty_print(b)
# [
# 1,
# [
# 2,
# [5, 6],
# 3
# ],
# 4
# ]
c = [1, 2, [3, 4, [5, 6]]]
my_pretty_print(c)
# [
# 1,
# 2,
# [
# 3,
# 4,
# [5, 6]
# ]
# ]
d = [1, 'Nana', ['Saki', 4, 5, [6, [7, 'Yuka'], 'Hana']], 10, ['Megu', 12]]
my_pretty_print(d)
# [
# 1,
# Nana,
# [
# Saki,
# 4,
# 5,
# [
# 6,
# [7, 'Yuka'],
# Hana
# ]
# ],
# 10,
# ['Megu', 12]
# ]
当たり前ですが、要素を区切るカンマ ',' の位置と数は元の構造と同じでなければなりません。
さていかがだったでしょうか?
今回の実装では list のネスト構造だけを対象にしています。
他のデータ構造が混じっていても対応できるように是非ご自分で進化させてみてください。
以下のように実装してみました。
my_pretty_print() はネストが深くなっていますので、まだまだ改良の余地が多いです。
また、コメントを多めに入れたのでコード本体が見辛くなってます、ご了承ください。
def print_line(item, level, indent=4, suffix=''):
spaces = '' if level == 0 else (' ' * indent) * level
print(f"{spaces}{item}{suffix}")
def check_iterable_not_str(item):
return hasattr(item, '__iter__') and not isinstance(item, str)
def my_pretty_print(seq, level=0, indent=4, suffix=''):
if check_iterable_not_str(seq):
if [item for item in seq if check_iterable_not_str(item)]:
print_line('[', level, indent)
for index, item in enumerate(seq, 1):
inner_suffix = '' if index == len(seq) else ','
if check_iterable_not_str(item):
my_pretty_print(item, level + 1, indent, inner_suffix)
else:
print_line(item, level + 1, indent, inner_suffix)
print_line(']', level, indent, suffix)
else:
print_line(seq, level, indent, suffix)