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

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

ただいまの
回答率

87.49%

関数での'int' object is not subscriptableへの対処

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 26K+

score 15

数字をN分割する関数を作っています。
コードは

def N_splitter(seq, N):
  avg=len(seq) / float(N)
  out=[]
  last=0.0
  while last<len(seq):
     out.append(seq[int(last):int(last+avg)])
     last += avg
  return np.array(out)


が模範解答で、

N_splitter(range(14),3)


とすると、

array([range(0,4),range(4,9),range(9,14)],dtype=object)


と出力されます。

私としては、range(14)を使うのが、少し気持ち悪く、どうして

N_splitter(14,3)


として出来ないのかと思いました。range()なしの形で出力すると、オブジェクトに長さの概念がないとlen(seq)がエラーになってしまったので、len(seq)をseqに変えて、出力すると、次は
'int' object is not subscriptableというエラーが出ました。これは、上記のwhile文out.append(の行についてです。これはどう解決できますか。教えてください。

うまくいかないコードは

def splitter(seq, N):
  avg= seq/float(N)
  out=[]
  last=0.0

   while last < seq:
     out.append( seq[int(last) : int(last + avg)])
     last += avg
   return np.array(out)


です。エラーとして

'int' object is not subscriptable


が出ました。これはwhile文中のout.append( seq[int(last) : int(last + avg)])で出ました。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • tachikoma

    2018/08/06 09:22 編集

    これは任意の数列seqをN分割する問題ですか?

    キャンセル

  • bbettbn

    2018/08/06 09:57

    はい、そうです。ここでは、seq=14として3分割しようとしています。

    キャンセル

  • t_obara

    2018/08/06 10:34

    数列を分割する関数がN_splitterということであれば、数列を渡すことになぜ気持ち悪さを覚えるのかよくわかりません。また、解決したい問題がよくわからないので、修正後の(うまくいかない)コードをご提示いただければと思います。

    キャンセル

  • bbettbn

    2018/08/06 11:12

    修正依頼ありがとうございます。うまくいかないコードを載せましたので、よろしくお願いします。

    キャンセル

回答 2

checkベストアンサー

0

N_splitter(14,3)で呼び出して、うまくいかないコードでエラーが出るということですよね?
14自体はただの数字ですので、どこかで0から14の数字列に変換してあげる必要があります。
その変換の仕方の一例がrange(14)なのです。
エラーが出ているappend行で具体的に何をしているのかをご理解いただくとより問題が認識できるのではないでしょうか。

仕様の問題でもありますが、N_splitter関数が数列を要求するのか、数字を要求するのかによりN_splitter内部実装が変わります。後者であった場合には、指定された数字をどのように扱うかも明確化が必要です。0から指定された数字の数列を分割するということであれば、N_splitter関数内部で0から指定された数字の数列を生成してから処理をする必要があります。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/06 11:33

    14を数字列に変換するという説明でよくわかりました。
    appendの行もよくわかっていなかったのですが、説明していただいたおかげで、appendの行はrange(14)[0:4]となり、outに入れていっていると理解することができました。
    ありがとうございました。
    t_obaraさんをベストアンサーにさせていただきますが、tachikomaさんも本当にありがとうございました。

    キャンセル

0

rangeがジェネレータのまま残っているので気持ち悪さがあるのかもしれませんね・・・。N_splitterは下記のようにふるまうのですが、下記の2つの例だとどういった点を変更したいのでしょうか。

myseq = list(range(14))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

N_splitter(myseq, 3)
# array([list([0, 1, 2, 3]), list([4, 5, 6, 7, 8]),
#        list([9, 10, 11, 12, 13])], dtype=object)

文字列の場合

myseq = "abcdefghijklmn"
# 

N_splitter(myseq, 3)
# array(['abcd', 'efghi', 'jklmn'], dtype='<U5')

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/06 11:23

    具体例まで書いていただき、ありがとうございます。
    私としては
    N_splitter(14,3)と引数を指定すれば、[[0,4], [4,9],[9,14]]というように出力するように出来ないのかなと思いました。

    キャンセル

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

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

関連した質問

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