検索ガイド -Search Guide-

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

【Python 雑談・雑学 + coding challenge】sorted 組み込み関数の key パラメータをうまく使って、カスタムオブジェクトを簡単にソートしよう! __getitem__、__len__ 特殊関数 ( special methods, dunder methods ) を実装すれば立派なシーケンス ( sequence ) です 投稿一覧へ戻る

Published 2020年8月29日7:09 by mootaro23

SUPPORT UKRAINE

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

唐突に coding challenge です!


問題: トランプをソート ( sort ) してください。 ( 制限時間: 25 分 )


ナナさんはトランプを 1 組持っています ( Deck クラスオブジェクト )。


妹にグチャグチャにシャッフルされてしまって途方に暮れています。


どうぞカードをソートしてあげてください。


カードの rank は 2, 3, ..., 9, 10, J, Q, K, A の順に強くなり、


カードの suit は clubs, diamonds, hearts, spades の順に強くなります。


ではお願いします (ペコリ)。


from collections import namedtuple
from random import shuffle


Card = namedtuple('Card', ['rank', 'suit'])


class Deck:
ranks = [str(n) for n in range(2, 11)] + list('JQKA')
suits = 'clubs diamonds hearts spades'.split()

def __init__(self):
self.cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]

def __len__(self):
return len(self.cards)

def __getitem__(self, pos):
return self.cards[pos]

def __setitem__(self, pos, value):
self.cards[pos] = value


deck = Deck()
shuffle(deck) # 妹よ、何ということを ...


sorted_deck = ソート関数(deck) # この部分を作成してください


print(sorted_deck[:5])

# [Card(rank='2', suit='clubs'), Card(rank='2', suit='diamonds'), Card(rank='2', suit='hearts'), Card(rank='2', suit='spades'), Card(rank='3', suit='clubs')]


print(sorted_deck[-5:])

# [Card(rank='K', suit='spades'), Card(rank='A', suit='clubs'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='hearts'), Card(rank='A', suit='spades')]



さて、いかがだったでしょか?


様々な方法があると思います。


今回は Python の sorted() 組み込み関数の key パラメータに、並べ替えのための比較値を提供する自作関数を渡す、という方法で実装してみました。


気付いたでしょうか? 実は、Deck クラスの ranks リスト、suits リストとも弱い順に並んでいるんです。


ここではそれをフルに活用しています。


def sort_deck(card: Card):
"""
Deck オブジェクトをソートする際の比較値を提供する

:param card: Card型
:return: 並べ替え時の比較値となる int 値
"""

rank_value = Deck.ranks.index(card.rank) # カードの数字ごとの強さを表す数値としてリストのインデックス番号を割り当てます
return rank_value * len(Deck.suits) + Deck.suits.index(card.suit) # カードのマークの強さを表す数値としてリストのインデックス番号を利用します

sorted_deck = sorted(deck, key=sort_deck)



これだけです。


deck = Deck()

shuffle(deck)

print(deck[:5])

# [Card(rank='10', suit='spades'), Card(rank='2', suit='clubs'), Card(rank='10', suit='hearts'), Card(rank='6', suit='spades'), Card(rank='J', suit='spades')]


print(deck[-5:])
# [Card(rank='K', suit='diamonds'), Card(rank='5', suit='clubs'), Card(rank='9', suit='diamonds'), Card(rank='8', suit='spades'), Card(rank='Q', suit='spades')]


sorted_deck = sorted(deck, key=sort_deck)


print(sorted_deck[:5])

# [Card(rank='2', suit='clubs'), Card(rank='2', suit='diamonds'), Card(rank='2', suit='hearts'), Card(rank='2', suit='spades'), Card(rank='3', suit='clubs')]


print(sorted_deck[-5:])
# [Card(rank='K', suit='spades'), Card(rank='A', suit='clubs'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='hearts'), Card(rank='A', suit='spades')]
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -
【Python 雑談・雑学 + coding challenge】シーケンス ( sequence ) における インデックス ( index ) を使った要素 1 つの取り出しと、スライス ( slice ) を利用した場合の取り出しの違いをちゃんと理解していますか?
【Python 雑談・雑学 + coding challenge】comprehension は確かに Pythonic ですけど、map 組み込み関数と使い分けることも必要ですね!
【Python 雑談・雑学 + coding challenge】collections モジュールの Counter クラスと most_common メソッドを利用してシーケンス内の最頻出要素を取得しよう!
【Python 雑談・雑学 + coding challenge】Python data structure の1つ、set を活用していますか? 複数のシーケンスの包含関係を調べるには最適です
【Python 雑談・雑学 + coding challenge】iterator protocol の実装 --- __iter__ 特殊関数は何を返すべき? イテレータオブジェクト ( iterator object ) なら何でも、そう、generator expression でもOKです!
【Python 雑談・雑学】 Common Mistake: mutable なオブジェクトを関数のデフォルト値に使っちゃダメでしょ、の話
【Python 雑談・雑学 + coding challenge】文字列中の数字を抜き出して桁区切りをつけよう! 正規表現 (regular expression ) を使うと「えっ!?」っていうくらい簡単ですょ。lookahead と negative lookahead を使います。