2つのアルファベット文字間のダッシュの数を数える方法は?


10

アルファベット文字とダッシュの文字列があり、この文字列内の2つのアルファベット文字間のダッシュの数を数えたい場合。これを行う最も簡単な方法は何ですか?

例:

入力: a--bc---d-k

出力: 2031

これは、aとbの間に2つのダッシュ、bとcの間に0のダッシュ、cとdの間に3つのダッシュ、dとkの間に1つのダッシュがあることを意味します

Pythonでこの出力リストを見つけるための良い方法は何ですか?


3
あなたは単にforループでそれを試すことができます。
Boseong Choi

1
@BoseongChoiはい、私は間違いなくループを試みましたが、混乱しました、もっと詳しく説明していただけますか?
Not_Founded

@ Ch3steR私はそのようなインプットがないと考えました。
Not_Founded

2
両方そうa-b-ca-----------b同じ出力になるもの11
ヒープオーバーフロー

これらはダッシュではなくハイフンです。
TRiG

回答:


9

正規表現による解決策:

import re

x = 'a--bc---d-k'

results = [
    len(m) for m in
    re.findall('(?<=[a-z])-*(?=[a-z])', x)
]
print(results)
print(''.join(str(r) for r in results))

出力:

[2, 0, 3, 1]
2031

ブルートフォースループロジックを使用したソリューション:

x = 'a--bc---d-k'

count = 0
results = []
for c in x:
    if c == '-':
        count += 1
    else:
        results.append(count)
        count = 0
results = results[1:]  # cut off first length
print(results)

出力:

[2, 0, 3, 1]

私が想定しfたパターンの前には、タイプミスでしょうか?バックスラッシュなしで生の文字列を作成する必要はありません。また、キャプチャグループ=)も必要ありません。いい答え
JvdV

1
@JvdVの良い点f、ありがとう。私はf-stringを使用していましたが、答えを改善している間にその部分を削除しfましたが、を削除するのを忘れていました。回答を更新しました。キャプチャグループも不要です:)
Boseong Choi

1
@Tim No. countは、が検出されたresultsときにのみ追加されc != '-'ます。でx終わる場合-、last countは無視されます。
Boseong Choi

11

次のような非常にシンプルなソリューションを使用できます。

import re

s = 'a--bc---d-k'
# Create a list of dash strings.
dashes = re.split('[a-z]', s)[1:-1]
# Measure the length of each dash string in the list and join as a string.
results = ''.join([str(len(i)) for i in dashes])

出力:

'2031'


2

入力もダッシュで始まる場合は、これを使用できます。

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return all_counts

ただし、入力が常に文字で始まる場合、常にリストの先頭にある0が気に入らない場合があります。

intの文字列として出力が必要な場合は、これを追加できます。

def count_dashes(string):
    all_counts = []
    dash_count = 0
    for char in string:
        if char == "-":
            dash_count += 1
        else:
            all_counts.append(dash_count)
            dash_count = 0
    return "".join([str(number) for number in all_counts])

1

簡単なループアプローチは次のとおりです。

myinput = 'a--bc---d-k'
output = []
output_count = -1
for elem in myinput:
  if elem == '-':
    output[output_count] = output[output_count]+1
  else:
    output.append(0)
    output_count += 1

print(output)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.