9

「01110000」というバイナリ文字列があり、forloop を記述せずに先頭のゼロの数を返したいと考えています。誰もそれを行う方法について何か考えがありますか? できれば、文字列がすぐに「1」で始まる場合にも 0 を返す方法

4

8 に答える 8

11

それが「バイナリ文字列」であると本当に確信している場合:

input = '01110000'
zeroes = input.index('1')

更新:「先頭の」ゼロしかないと壊れます

すべてゼロのケースを処理する代替形式。

zeroes = (input+'1').index('1')
于 2013-01-24T20:21:28.863 に答える
9

簡単なワンライナー:

x = '01110000'
leading_zeros = len(x.split('1', 1)[0])

これにより、文字列が最初の '1' までのすべてとその後の残りの部分に分割され、プレフィックスの長さがカウントされます。の 2 番目の引数splitは単なる最適化であり、実行する分割の数を表します。つまり、すべてのオカレンスで分割するのではなく、最初の '1' を見つけた後に関数が停止します。x.split('1')[0]パフォーマンスが問題にならない場合にのみ使用できます。

于 2013-01-24T20:20:52.437 に答える
8

別の方法は次のとおりです。

In [36]: s = '01110000'

In [37]: len(s) - len(s.lstrip('0'))
Out[37]: 1

他のソリューションとは異なり、最初の1. これにより、もう少し一般的になりますが、特定の問題は問題ではありません。

于 2013-01-24T20:22:54.203 に答える
3

私は使用します:

s = '00001010'
sum(1 for _ in itertools.takewhile('0'.__eq__, s))

むしろpythonicで、空の文字列や非バイナリ文字列など、一般的なケースで機能し、任意の長さの文字列(またはイテレータ)を処理できます。

于 2014-04-12T10:04:32.387 に答える
3

0 または 1 だけであることがわかっている場合:

x.find(1)

(すべてゼロの場合は -1 を返します。その動作が必要な場合とそうでない場合があります)

于 2013-01-24T20:21:58.297 に答える
0

reモジュールはどうですか?

a = re.search('(?!0)', data)

次にa.start()ポジションです。

于 2016-03-25T08:30:44.060 に答える