文字列中に同じ文字が並んでいたら1文字にまとめたい場合、RubyではString#squeeze
を利用します。
p "112233445566778899".squeeze
#=> "123456789"
Python3で、同じことを実現するにはどうすればよいでしょうか?
まずitertools.groupby
を利用する方法があります。
import itertools
s = "112233445566778899"
t = ''.join(c for c, _ in itertools.groupby(s))
print(t)
#=> '123456789'
内包表記の代わりにoperator.itemgetter
を利用することもできます。
import itertools, operator
s = "112233445566778899"
t = ''.join(map(operator.itemgetter(0), itertools.groupby(s)))
print(t)
#=> '123456789'
正規表現を利用する方法もあります。
import re
s = "112233445566778899"
t = re.sub(r'(.)(\1+)', r'\1', s)
print(t)
#=> 123456789
もっとも、この程度であれば、愚直に実装するほうがPythonicかもしれません。
def squeeze(s):
stack = []
for c in s:
if len(stack) == 0 or stack[-1] != c:
stack.append(c)
return ''.join(stack)
s = "112233445566778899"
t = squeeze(s)
print(t)
#=> 123456789
環境情報
- Python 3.8.10
- ruby 3.1.2p20 (2022-04-12 revision 4491bb740a) [x86_64-linux]