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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

30233閲覧

配列から任意の要素を取り出す処理のエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/06/27 05:05

編集2019/06/27 05:15

前提・実現したいこと

Pythonで麻雀のプログラミングを作っています。(AIではなくて、天鳳のような麻雀を遊べるもの)
そこで山牌を配列にし(yamahai[])、その配列をシャッフルした上で任意の要素を取り出そうとしまた。

発生している問題・エラーメッセージ

TypeError: list indices must be integers or slices, not tuple

該当のソースコード

Python

1import random 2#山牌 3yamahai = ["amanzu1","amanzu1","amanzu1","amanzu1" 4 ,"amanzu2","amanzu2","amanzu2","amanzu2" 5 ,"amanzu3","amanzu3","amanzu3","amanzu3" 6 ,"amanzu4","amanzu4","amanzu4","amanzu4" 7 ,"amanzu5","amanzu5","amanzu5","amanzu5" 8 ,"amanzu6","amanzu6","amanzu6","amanzu6" 9 ,"amanzu7","amanzu7","amanzu7","amanzu7" 10 ,"amanzu8","amanzu8","amanzu8","amanzu8" 11 ,"amanzu9","amanzu9","amanzu9","amanzu9" 12 ,"bpinzu1","bpinzu1","bpinzu1","bpinzu1" 13 ,"bpinzu2","bpinzu2","bpinzu2","bpinzu2" 14 ,"bpinzu3","bpinzu3","bpinzu3","bpinzu3" 15 ,"bpinzu4","bpinzu4","bpinzu4","bpinzu4" 16 ,"bpinzu5","bpinzu5","bpinzu5","bpinzu5" 17 ,"bpinzu6","bpinzu6","bpinzu6","bpinzu6" 18 ,"bpinzu7","bpinzu7","bpinzu7","bpinzu7" 19 ,"bpinzu8","bpinzu8","bpinzu8","bpinzu8" 20 ,"bpinzu9","bpinzu9","bpinzu9","bpinzu9" 21 ,"csouzu1","csouzu1","csouzu1","csouzu1" 22 ,"csouzu2","csouzu2","csouzu2","csouzu2" 23 ,"csouzu3","csouzu3","csouzu3","csouzu3" 24 ,"csouzu4","csouzu4","csouzu4","csouzu4" 25 ,"csouzu5","csouzu5","csouzu5","csouzu5" 26 ,"csouzu6","csouzu6","csouzu6","csouzu6" 27 ,"csouzu7","csouzu7","csouzu7","csouzu7" 28 ,"csouzu8","csouzu8","csouzu8","csouzu8" 29 ,"csouzu9","csouzu9","csouzu9","csouzu9" 30 ,"dhigasi","dhigasi","dhigasi","dhigasi" 31 ,"eminami","eminami","eminami","eminami" 32 ,"fnisi","fnisi","fnisi","fnisi" 33 ,"gkita","gkita","gkita","gkita" 34 ,"hhaku","hhaku","hhaku","hhaku" 35 ,"ihatu","ihatu","ihatu","ihatu" 36 ,"jtyun","jtyun","jtyun","jtyun" 37 ] 38 39random.shuffle(yamahai) 40 41haipai1 = yamahai[0,1,2,3,17,18,19,20,33,34,35,36,49] 42haipai2 = yamahai[5,6,7,8,21,22,23,24,37,38,39,40,50] 43haipai3 = yamahai[9,10,11,12,25,26,27,28,41,42,43,44,51] 44haipai4 = yamahai[13,14,15,16,29,30,31,32,45,46,47,48,52] 45 46print(sorted(haipai1)) 47print(sorted(haipai2)) 48print(sorted(haipai3)) 49print(sorted(haipai4)) 50 51exit() 52

試したこと

エラー文を検索かけて、yamahai[,]を[][]にしてみたりprint(yamahai[])にしてみたりしたんですけど全部同じエラー文が出ました。

補足情報(FW/ツールのバージョンなど)

Atomで書いてます。勉強し始めたばかりでここに何を書けばいいのかよくわかっていません、ごめんなさい。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

インデックスのリストを指定して値を取得するのは、Python の組み込みのリストでは対応していないです。

numpy の ndarray をお使いください。

python

1import numpy as np 2 3a = np.array(["a", "b", "c", "d", "e"]) 4 5print(a[[1, 3]]) # インデックス1, 3 の値を取りだす

python

1import numpy as np 2import random 3 4# 山牌 5yamahai = np.array( 6 [ 7 "amanzu1", 8 "amanzu1", 9 "amanzu1", 10 "amanzu1", 11 "amanzu2", 12 "amanzu2", 13 "amanzu2", 14 "amanzu2", 15 "amanzu3", 16 "amanzu3", 17 "amanzu3", 18 "amanzu3", 19 "amanzu4", 20 "amanzu4", 21 "amanzu4", 22 "amanzu4", 23 "amanzu5", 24 "amanzu5", 25 "amanzu5", 26 "amanzu5", 27 "amanzu6", 28 "amanzu6", 29 "amanzu6", 30 "amanzu6", 31 "amanzu7", 32 "amanzu7", 33 "amanzu7", 34 "amanzu7", 35 "amanzu8", 36 "amanzu8", 37 "amanzu8", 38 "amanzu8", 39 "amanzu9", 40 "amanzu9", 41 "amanzu9", 42 "amanzu9", 43 "bpinzu1", 44 "bpinzu1", 45 "bpinzu1", 46 "bpinzu1", 47 "bpinzu2", 48 "bpinzu2", 49 "bpinzu2", 50 "bpinzu2", 51 "bpinzu3", 52 "bpinzu3", 53 "bpinzu3", 54 "bpinzu3", 55 "bpinzu4", 56 "bpinzu4", 57 "bpinzu4", 58 "bpinzu4", 59 "bpinzu5", 60 "bpinzu5", 61 "bpinzu5", 62 "bpinzu5", 63 "bpinzu6", 64 "bpinzu6", 65 "bpinzu6", 66 "bpinzu6", 67 "bpinzu7", 68 "bpinzu7", 69 "bpinzu7", 70 "bpinzu7", 71 "bpinzu8", 72 "bpinzu8", 73 "bpinzu8", 74 "bpinzu8", 75 "bpinzu9", 76 "bpinzu9", 77 "bpinzu9", 78 "bpinzu9", 79 "csouzu1", 80 "csouzu1", 81 "csouzu1", 82 "csouzu1", 83 "csouzu2", 84 "csouzu2", 85 "csouzu2", 86 "csouzu2", 87 "csouzu3", 88 "csouzu3", 89 "csouzu3", 90 "csouzu3", 91 "csouzu4", 92 "csouzu4", 93 "csouzu4", 94 "csouzu4", 95 "csouzu5", 96 "csouzu5", 97 "csouzu5", 98 "csouzu5", 99 "csouzu6", 100 "csouzu6", 101 "csouzu6", 102 "csouzu6", 103 "csouzu7", 104 "csouzu7", 105 "csouzu7", 106 "csouzu7", 107 "csouzu8", 108 "csouzu8", 109 "csouzu8", 110 "csouzu8", 111 "csouzu9", 112 "csouzu9", 113 "csouzu9", 114 "csouzu9", 115 "dhigasi", 116 "dhigasi", 117 "dhigasi", 118 "dhigasi", 119 "eminami", 120 "eminami", 121 "eminami", 122 "eminami", 123 "fnisi", 124 "fnisi", 125 "fnisi", 126 "fnisi", 127 "gkita", 128 "gkita", 129 "gkita", 130 "gkita", 131 "hhaku", 132 "hhaku", 133 "hhaku", 134 "hhaku", 135 "ihatu", 136 "ihatu", 137 "ihatu", 138 "ihatu", 139 "jtyun", 140 "jtyun", 141 "jtyun", 142 "jtyun", 143 ] 144) 145 146random.shuffle(yamahai) 147 148haipai_idx1 = sorted([0, 1, 2, 3, 17, 18, 19, 20, 33, 34, 35, 36, 49]) 149haipai_idx2 = sorted([5, 6, 7, 8, 21, 22, 23, 24, 37, 38, 39, 40, 50]) 150haipai_idx3 = sorted([9, 10, 11, 12, 25, 26, 27, 28, 41, 42, 43, 44, 51]) 151haipai_idx4 = sorted([13, 14, 15, 16, 29, 30, 31, 32, 45, 46, 47, 48, 52]) 152 153player1 = yamahai[haipai_idx1] 154player2 = yamahai[haipai_idx2] 155player3 = yamahai[haipai_idx3] 156player4 = yamahai[haipai_idx4] 157 158print("player1", player1)
player1 ['csouzu3' 'amanzu6' 'bpinzu7' 'amanzu5' 'amanzu2' 'bpinzu7' 'bpinzu5' 'bpinzu3' 'bpinzu3' 'bpinzu9' 'fnisi' 'amanzu7' 'hhaku']

投稿2019/06/27 05:13

tiitoi

総合スコア21960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/27 05:17

なるほど!ありがとうございます!
guest

0

違うエラーが出る筈ですが。Wandbox

Traceback (most recent call last): File "prog.py", line 41, in <module> haipai1 = yamahai[0,1,2,3,17,18,19,20,33,34,35,36,49] TypeError: list indices must be integers or slices, not tuple

yamahai[0,1]と書けば0番目と1番目を取り出せる...
なんて便利機能は無いからです。存在しない文法を使ってはいけません。

おまけ

すごく雑な実装でも良ければこんなふうにも書けます。

Python

1import random 2 3 4def make_pieces(): 5 pieces = ['東', '南', '西', '北', '白', '發', '中'] 6 pieces += [ 7 '{}{}'.format(n, k) 8 for n in range(1, 10) 9 for k in ['萬', '筒', '索'] 10 ] 11 12 return 4 * pieces 13 14 15def key_for_piece(piece): 16 honors = ['東', '南', '西', '北', '白', '發', '中'] 17 if piece in honors: 18 return 90 + honors.index(piece) 19 20 # 21 simples = ['萬', '筒', '索'] 22 num, simple = piece 23 24 return simples.index(simple) * 10 + int(num) 25 26 27def print_pieces(pieces): 28 pieces = sorted(pieces, key=key_for_piece) 29 print(*pieces) 30 31 32pieces = make_pieces() 33random.shuffle(pieces) 34 35hand = pieces[:13] 36print_pieces(hand)

実行結果 Wandbox

plain

17萬 1筒 4筒 9筒 2索 3索 9索 東 東 西 白 白 中

実際にはcollections.dequeあたりを使った方が牌の重複などトラブルは起きづらいでしょう。

投稿2019/06/27 05:09

編集2019/06/27 05:38
LouiS0616

総合スコア35676

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/27 05:13

コピペする場所間違えてました、すみません。 配列を作成するときに使えたので、勝手に使えるものだと思い使っていました。回答ありがとうございます!
LouiS0616

2019/06/27 05:15

配牌を正確に再現したかったのかもしれませんが、シャッフルしている以上それは拘る必要の無いことです。 スライスを使って先頭13要素(親なら14ですね)を取り出せば良いでしょう。
退会済みユーザー

退会済みユーザー

2019/06/27 05:19

最初それで書いていたのですが、ドラ表示牌や嶺上牌などを考えたらこのやり方のほうがいいのではないかと思いこういう書き方にしました。その辺のことを考えてもこの操作って必要のないものなのでしょうか?
LouiS0616

2019/06/27 05:21 編集

全く必要無いですね。 どちらの方法を選んでも、結局山の頭から 13*3+14牌 削れるだけですし。
LouiS0616

2019/06/27 05:23

強いて言うなら王牌だけは前以て取り分けておいた方が楽かもです。
退会済みユーザー

退会済みユーザー

2019/06/27 05:24

なるほど、重ねて質問してしまったのにご丁寧に解説していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問