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

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

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

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

Q&A

解決済

4回答

254閲覧

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

sera

総合スコア13

Python

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

0グッド

0クリップ

投稿2017/11/04 03:14

###実現したいこと
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から始まる数列です

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

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

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

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

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

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

guest

回答4

0

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

python

1def splitAtOnes(l): 2 ones = [i for i, v in enumerate(l) if v == 1] 3 ones.append(None) 4 return [l[ones[i]:ones[i + 1]] for i in range(len(ones) - 1)] 5 6splitAtOnes([1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6]) 7# -> [[1, 2, 3, 4, 5], [1, 2, 3, 4], [1, 2], [1, 2, 3, 4, 5]]

投稿2017/11/04 03:43

編集2017/11/04 04:30
karamarimo

総合スコア2551

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

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

can110

2017/11/04 04:26

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

2017/11/04 04:30

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

0

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

Python

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

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

Python

1def get_indices(arg, num): 2 for i, v in enumerate(arg): 3 if v == num: 4 yield i 5 6hoge = [1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 1, 2, 3, 4, 5, 6] 7indices = list(get_indices(hoge+[1], 1)) 8result = [hoge[begin:end] for begin, end in zip(indices, indices[1:])] 9print(result)

投稿2017/11/04 03:42

編集2017/11/04 03:53
LouiS0616

総合スコア35660

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

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

0

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


追記:

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

python

1arr_in = [1,2,3,4,5,1,2,3,4,1,2,1,2,3,4,5,6] 2print(arr_in) 3 4arr_out = [] 5arr = [] 6for i in arr_in: 7 if i == 1: 8 arr = [i] 9 arr_out.append(arr) 10 else: 11 arr.append(i) 12 13print(arr_out)

投稿2017/11/04 03:28

編集2017/11/04 04:27
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sera

2017/11/04 04:31

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

0

ベストアンサー

Python

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

投稿2017/11/04 03:27

編集2017/11/04 04:22
_Victorique__

総合スコア1392

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

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

sera

2017/11/04 03:38

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

2017/11/04 03:40

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

2017/11/04 03:48

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

2017/11/04 04:23

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

2017/11/04 04:24

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問