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

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

ただいまの
回答率

88.62%

Python:リストを複数のリストに分割したい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 7,362

Ykkykk

score 118

リストを複数の別のリストに分割したいです。

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [3, 4, 7]


リストaをリストbに含まれている値の位置で分割していきたいです。

#b[3]のとき
c = [1, 2, 3, 4]
#b[4]のとき
d = [5]
#b[7]のとき
e = [6, 7, 8]
#残り
f = [9, 10]


上記の例ですと、以上のような分け方にしたいのですが、皆目見当がつきません。
リストをn個のリストに分割するのではなく、別のリストで与えた値の位置で分割するにはどのようにすればよいのでしょうか?
リストを作るための空のリストをどのように用意しておけばいいのかという点からすでにわかりません。abもあらかじめ要素の数がわからない(bの要素数がaの要素数を超えることはない)ため、空のリストをあらかじめ用意することはできないように思っています。
そもそも以上のような処理は現実的なのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+2

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
separate = [3, 4, 7]

start = 0
newArray = []
for s in separate :
    newArray.append(a[start:s+1])
    start = s+1
newArray.append(a[start:])

print(newArray)

変数を動的に作るのはできないので、配列の中に配列を入れています

array[a:b]というのは配列の中のa番目からb番目の直前までを抜き出すという意味です

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/25 15:40

    ご回答いただきありがとうございます。
    やはり動的に変数を作ることはできないのですね…。
    配列の配列にしてアクセスすることになるということですね。
    ありがとうございます!

    キャンセル

+2

numpy.array_split() を使うとよいと思います。
第1引数のリストを第2引数で指定されたインデックスの直前で分割します。
今回はインデックスの直後で分割するとのことだったので、np.array(b) + 1 としています。

import numpy as np

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
b = [3, 4, 7]

split_array = np.array_split(a, np.array(b) + 1)
print(split_array)  # [array([1, 2, 3, 4]), array([5]), array([6, 7, 8]), array([ 9, 10])]

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/25 15:41

    ご回答いただきありがとうございます。
    numpyを使用してもできるのですね。
    この場合、split_array内のリストの要素にアクセスする際は、通常のネストされたリストと同じように添え字で指定することができるのでしょうか?

    キャンセル

  • 2018/10/25 15:43

    通常のリストとまったく同じ使い方ができます。

    print(split_array[0]) # [1 2 3 4]
    print(split_array[0][1]) # 2

    キャンセル

  • 2018/10/25 15:47

    なるほど!よくわかりました。
    ありがとうございます!

    キャンセル

0

separate[x:y] で [separate[x], ..., separatey[y -1]] を取り出せることを利用します。

sep.py

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
separate = [3, 4, 7]

sp = [0] + [x +1 for x in separate] + [len(a)]
result = [a[sp[i]:sp[i + 1]] for i in range(len(sp) - 1)]
print(result)

上のコードでは、 sp = [0, 4, 5, 8, 10] となります。
そして a[0:4], a[4:5], a[5:8], a[8:10] のように取り出していっています。

実行例
イメージ説明

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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