下のリストの'a'を数えて[2, 1, 3]と出力したいのですがいい方法が思いつきません。
python
1st = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 2 3count = 0 4lis = []__イタリックテキスト__ 5for s in st: 6 if s == 'a': 7 count += 1 8 else: 9 if count > 0: 10 lis.append(count) 11 count = 0 12
上の方法だと、最後の'a'を見た後lisに3が追加されません。
解決策として文字列の最後に'.'を加える方法を考えましたが、あまり良くない手だと思うので、他に良い方法があれば教えて下さい。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
forループが終わったあとに
python
1if count > 0: 2 lis.append(count)
を付け加えるのはいかがでしょう?
ちなみに、こんな書き方もできます。
python
1st = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 2lis = [*map(len, ''.join(' a'[s == 'a'] for s in st).split())] 3print(lis)
投稿2020/01/18 09:33
編集2020/01/18 10:10総合スコア5406
0
投稿2020/01/19 07:56
編集2020/01/19 08:51総合スコア22324
0
既に解決済みですが、参考までに。
このような処理ではitertools.groupbyが便利です。
Python
1import itertools 2 3 4src = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 5dst = [] 6 7for s, it in itertools.groupby(src, lambda s: s == 'a'): 8 if not s: 9 continue 10 11 l = sum(1 for _ in it) 12 dst.append(l) 13 14print(dst)
実行結果 Wandbox
[2, 1, 3]
内包表記を使うと更に簡潔です。慣れるまでは少し読みづらいですが。
Python
1import itertools 2 3 4src = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 5dst = [ 6 sum(1 for _ in it) 7 for s, it in itertools.groupby(src, lambda s: s == 'a') 8 if s 9] 10 11print(dst)
解決策として文字列の最後に'.'を加える方法を考えましたが、あまり良くない手だと思う
番兵法ですね。簡単に解決できる良い方法だと思います。
ただ番兵として使うのであればNULL文字など通常使わない文字を用いた方が良いかと。
投稿2020/01/18 12:09
総合スコア35660
0
これでどうでしょうか。
python
1 2st = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 3 4count = 0 5lis = [] 6for s in st: 7 if s == 'a': 8 count += 1 9 else: 10 if count > 0: 11 lis.append(count) 12 count = 0 # インデント追加 13if count > 0: # 追加 14 lis.append(count) # 追加 15print(lis)
結果
[2, 1, 3]
投稿2020/01/18 09:43
総合スコア1167
0
元のソースコードだと、配列の最後が 'a' だったときに lis に count を追加できませんでした。
そこで、s == 'a' のときであっても、もしそれが配列の最後であれば lis に count を追加するようにしました。
python
1st = ['a', 'a', '_', '_', 'a', '_', 'a', 'a', 'a'] 2st_length = len(st) 3 4count = 0 5lis = [] #__イタリックテキスト__ 6for i, s in enumerate(st): 7 if s == 'a': 8 count += 1 9 if i == st_length -1: 10 lis.append(count) 11 else: 12 if count > 0: 13 lis.append(count) 14 count = 0
補足
文字列の最後に'.'を加える方法
これは確かに良くない方法だと思います。避けるのが賢明だと感じました。
投稿2020/01/18 09:37
総合スコア1382
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/18 10:10
2020/01/18 10:26 編集
2020/01/18 10:27 編集
2020/01/18 10:44 編集
2020/01/18 10:38