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

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

ただいまの
回答率

91.02%

  • Python

    5524questions

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

Pythonでのリスト操作 | リストを分割したい

解決済

回答 4

投稿

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

sera

score 7

実現したいこと

Pythonでのリスト操作について質問です

[1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6]

のようなリストを1から始まる要素で分割して

[[1,2,3,4,5][1,2,3,4][1,2][1,2,3,4,5,6]]

という形にしたいのですが、どうすればいいのかわかりません

分割数、要素の最大値はどちらも毎回変動しますが、1,2,3,4,…というように必ず1から始まる数列です

どんな方法でも構いませんので、わかる方教えていただけませんか?

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+1

一応こんな風に出来ますが、ちょっと美しさに欠ける印象です。
もっといい方法があるような気もします。

hoge = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 5, 6]
indices = [i for i, x in enumerate(hoge) if x == 1] + [len(hoge)]
result = [hoge[begin:end] for begin, end in zip(indices, indices[1:])]
print(result)

ちょっと改造。ほぼ変わりませんが。

def get_indices(arg, num):
    for i, v in enumerate(arg):
        if v == num:
            yield i

hoge = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 5, 6]
indices = list(get_indices(hoge+[1], 1))
result = [hoge[begin:end] for begin, end in zip(indices, indices[1:])]
print(result)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

1のインデックスのリストを取得し、リスト内の隣り合うインデックスで元のリストをスライスすればできます。

def splitAtOnes(l):
    ones = [i for i, v in enumerate(l) if v == 1]
    ones.append(None)
    return [l[ones[i]:ones[i + 1]] for i in range(len(ones) - 1)]

splitAtOnes([1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6])
# -> [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2], [1, 2, 3, 4, 5]]

`

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/04 13:26

    最後、末尾まで取りたいので`append(-1)`→`append(None)`とすべきかと思います。

    キャンセル

  • 2017/11/04 13:30

    あ、そうですね。うっかりしてました。ありがとうございます。

    キャンセル

checkベストアンサー

0

lst = [1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6]+[1]
num = [i for i,n in enumerate(lst+[1]) if n==1 or lst[i+1]==1]
num_lst = [num[i:i+2] for i in range(0,len(num),2)]
ans = [lst[sf[0]:sf[1]+1] for i,sf in enumerate(num_lst) if i!=len(num_lst)-1]
print(ans)

出力結果
[[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2], [1, 2, 3, 4, 5, 6]]

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/04 12:38

    回答ありがとうございます

    もう1つだけ質問させてください
    出力結果を
    [[1,2,3,4,5],[1,2,3,4],[1,2],[1,2,3,4,5,6]]
    とすることはできますか?

    キャンセル

  • 2017/11/04 12:40

    コードに[]を追加するだけですね。
    忘れていたので追加しておきました

    キャンセル

  • 2017/11/04 12:48

    すみません、少し違います...
    新しく回答いただいた方のように [ ]の中がリストになってほしいんです

    キャンセル

  • 2017/11/04 13:23

    すみません、修正したのでご確認ください

    キャンセル

  • 2017/11/04 13:24

    何度もすみませんでした
    ありがとうございます

    キャンセル

0

愚直に全要素をループさせて配列を構築するのがよさそうに感じます。


追記:

解決済みとなったようですが、実際のコードを書いておくと下記のようになるでしょうか。

arr_in = [1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6]
print(arr_in)

arr_out = []
arr = []
for i in arr_in:
   if i == 1:
      arr = [i]
      arr_out.append(arr)
   else:
      arr.append(i)

print(arr_out)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/04 13:31

    わざわざコードを書いてくださったんですね
    ありがとうございます

    いちばんわかりやすいです

    キャンセル

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

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

関連した質問

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

  • Python

    5524questions

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