質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.32%

  • Python 3.x

    7419questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

python3 トランプを引いたらデッキから削除したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 611

Sample_Test

score 142

デッキからユーザーに引いたカードを移して、
ユーザー手札から、存在するカードをデッキから削除したい。

問題

削除するカードがが有りませんと、エラーが出てしまいます。

どうしたら良いでしょうか?
教えて頂きたいです。

cards=['♠A', '♥A', '♣A', '♦A', '♠2', '♥2', '♣2', '♦2', '♠3', '♥3', '♣3', '♦3', '♠4', '♥4', '♣4', '♦4', '♠5', '♥5', '♣5', '♦5', '♠6', '♥6', '♣6', '♦6', '♠7', '♥7', '♣7', '♦7', '♠8', '♥8', '♣8', '♦8', '♠9', '♥9', '♣9', '♦9', '♠10', '♥10', '♣10', '♦10', '♠J', '♥J', '♣J', '♦J', '♠Q', '♥Q', '♣Q', '♦Q', '♠K', '♥K', '♣K', '♦K']

use01=[]
use02=[]

def Sample04():
    use01.append(random.sample(cards, 2))

    for i in use01:
        for i2 in i:
            cards.remove(i2)
    #cards.remove(use01[0][i])


for i in range(6):
    Sample04()


print(use01,len(cards))
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

もうちょっとスマートに書けそうな気がします。

import random

def make_deck():
    return [
        '♠A', '♠2', '♠3', '♠4', '♠5', '♠6', '♠7', '♠8', '♠9', '♠10', '♠J', '♠Q', '♠K',
        '♥A', '♥2', '♥3', '♥4', '♥5', '♥6', '♥7', '♥8', '♥9', '♥10', '♥J', '♥Q', '♥K',
        '♦A', '♦2', '♦3', '♦4', '♦5', '♦6', '♦7', '♦8', '♦9', '♦10', '♦J', '♦Q', '♦K',
        '♣A', '♣2', '♣3', '♣4', '♣5', '♣6', '♣7', '♣8', '♣9', '♣10', '♣J', '♣Q', '♣K',
        'JOKER', 'JOKER'
    ]

def draw_from_deck(deck, hand, n=1):
    for i in range(n):
        card = random.choice(deck)
        hand.append(card)
        deck.remove(card)

    return hand

def main():
    deck = make_deck()
    hand = draw_from_deck(deck, [], 5)
    print('deck:', deck)
    print('hand:', hand)

if __name__ == '__main__':
    main()

実行結果

deck: ['♠A', '♠2', '♠3', '♠4', '♠5', '♠7', '♠8', '♠9', '♠10', '♠J', '♠Q', '♠K', '♥A', '♥2', '♥3', '♥4', '♥5', '♥6', '♥7', '♥8', '♥9', '♥10', '♥J', '♥Q', '♥K', '♦A', '♦2', '♦3', '♦4', '♦5', '♦6', '♦7', '♦9', '♦10', '♦J', '♦Q', '♦K', '♣A', '♣3', '♣4', '♣5', '♣6', '♣7', '♣8', '♣9', '♣10', '♣Q', '♣K', 'JOKER']
hand: ['♦8', '♣J', 'JOKER', '♣2', '♠6']

カードのソートなどを見据えると、適切にクラス化するとさらに良さそうですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/21 22:31

    本当は人間のように一枚ずつ取り出す必要はなかったです。
    シャッフルして、スライスすることと等価です。

    キャンセル

  • 2017/12/21 22:33

    おっしゃる通りかと思います。
    最初はsetで実装するのが妥当かと考えたのですが、そうするとジョーカーの扱いが面倒なんですよね。
    実行速度も大してくわないので、直感的に一枚ずつ引くのもありかと思ったのです。

    キャンセル

  • 2017/12/21 22:37

    手札を追加するときにも使用できる汎用的な実装で素晴らしいと思います。

    キャンセル

+2

引いたカードを削除するのではなく、カードをいちまいずつイテレートするという発想で。

from itertools import islice
from random import shuffle


cards=['♠A', '♥A', '♣A', '♦A', '♠2', '♥2', '♣2', '♦2', '♠3', '♥3', '♣3', '♦3', '♠4', '♥4', '♣4', '♦4', '♠5', '♥5', '♣5', '♦5', '♠6', '♥6', '♣6', '♦6', '♠7', '♥7', '♣7', '♦7', '♠8', '♥8', '♣8', '♦8', '♠9', '♥9', '♣9', '♦9', '♠10', '♥10', '♣10', '♦10', '♠J', '♥J', '♣J', '♦J', '♠Q', '♥Q', '♣Q', '♦Q', '♠K', '♥K', '♣K', '♦K']


def Deck():
    D = cards[:]
    shuffle(D)
    yield from D


deck = Deck()
user01 = list(islice(deck, 6))
user02 = list(islice(deck, 6))

print('user01:', *user01)
print('user02:', *user02)
print('rest:', *deck)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

use01の中身を書き出して、監視してみてください。
2ラウンド目で、1ラウンド目に取り除いたカードを再度削除しようとするはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7419questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。