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

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

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

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

Q&A

解決済

1回答

590閲覧

pythonのリストの要素取得について

ML_beginner

総合スコア21

Python

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

0グッド

0クリップ

投稿2021/05/10 04:33

編集2021/05/10 06:21

下記のような結果を取得するpythonのコードを書きたいです。
よろしくお願い致します。

配列:[4,4,2,4,5,3,1,3,4,1,2,2,3]
結果:[[6],[9,10,11]]

【テーマ】
または1,2・・・のインデックスを取得する

【内容】
配列に1がある場合
・2が続く場合は2が続くまでインデックスを返す
・2が続かない場合は終わる

よろしくお願い致します。

あまり良い書き方ではないですが、私のコードを記載します。
【追記】

python

1result=[] 2for i, x in enumerate(src): 3 if x == 1: 4 sample=[] 5 sample.append(i) 6 for j, y in enumerate(src[i+1:-1]): 7 if y ==2: 8 sample.append(i+j+1) 9 else: 10 break 11 result.append(sample)

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

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

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

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

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

guest

回答1

0

ベストアンサー

思い付きです。解説はしません。

Python

1import re 2 3 4src = [4,4,2,4,5,3,1,3,4,1,2,2,3] 5assert all(len(str(e)) == 1 for e in src) # srcの全要素は1桁 6 7dst = [ 8 [*range(m.start(), m.end())] 9 for m in re.finditer(r'12*', ''.join(map(str, src))) 10] 11 12 13print(dst)

実行結果 Wandbox

[[6], [9, 10, 11]]

コメントを受けて

例えば、こんなふうに。

Python

1dst = [] 2 3i = 0 4while i < len(src): 5 if src[i] != 1: 6 i += 1 7 continue 8 9 dst.append([i]) 10 i += 1 11 12 while i < len(src) and src[i] == 2: 13 dst[-1].append(i) 14 i += 1

for文を使うなら二回に分けた方が無駄が少ないように思います。

Python

1dst = [] 2 3it = ( 4 i for i, e in enumerate(src) 5 if e == 1 6) 7for index_1 in it: 8 dst.append([index_1]) 9 10 idx = index_1 + 1 11 for i, e in enumerate(src[idx:], start=idx): 12 if e != 2: 13 break 14 15 dst[-1].append(i)

さらに追記

普通に読み辛いですし効率面も特段良くありませんが、個人的にはこういうのが好きです。
おまけです。

Python

1indice_1 = ( 2 i for i, e in enumerate(src) 3 if e == 1 4) 5dst = [ 6 [idx, *map(operator.itemgetter(0), zip( 7 itertools.count(idx+1), 8 itertools.takewhile( 9 lambda e: e == 2, src[idx+1:] 10 ) 11 ))] 12 for idx in indice_1 13]

投稿2021/05/10 04:52

編集2021/05/10 08:18
LouiS0616

総合スコア35668

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

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

ML_beginner

2021/05/10 05:09

for文を使わずに正規表現で記載している点が非常に参考になりました。 ご回答頂きありがとうございました。
LouiS0616

2021/05/10 05:14

普通にwhile文を使った方が読み易く応用も効くと思いますよ。是非トライしてみて下さい。
ML_beginner

2021/05/10 06:19

イテレーションを使ったやり方が分かりません。 理由としては、私の方針ではリストをfor文で回して1を見つけるというのがアプローチと考えました。 その際に1があった場合、次のイテレータの条件が書けません。 発見した1以降でfor文をもう一度回せば書けるとは思うのですが、あまり良いコードではないような気がしました。 お忙しい所恐縮ですが、方針だけでもご教示いただけないでしょうか。 【コード】 result=[] for i, x in enumerate(src): if x == 1: sample=[] sample.append(i) for j, y in enumerate(src[i+1:-1]): if y ==2: sample.append(i+j+1) else: break result.append(sample)
LouiS0616

2021/05/10 06:33

しっかり考えておられるようなので(偉そうな言い方ですみません、しかし結果だけ欲しがる人がこのサイトには溢れかえっているのです)、回答に追記しました。
ML_beginner

2021/05/10 07:23

ご丁寧にかつ迅速なご回答頂きまして誠にありがとうございます。 試したことなどを記載せず、簡潔な文章で質問を行なったことがかえって誤解を招いてしまいました。 またコードを頂き大変参考になりました。 ・for文ではリストを二度作成することが無駄、ジェネレータ式で必要な部分だけ取り出す点 ・while文ではi+1を行い、もう一度whileを使う点 ・whileを使用すると同じ変数で二度ループできる点 ・whileを使用することで一周分の処理になるため高速動作が期待できる点 今回コードレビューまでして頂き大変勉強になりました。 enumerateの引数指定の知識やジェネレータ使用のアイデア等他の人のやり方に触れる機会がないので、設計アイデアの欠如や知識不足を痛感しました。 改めて、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問