0
0

文字列中に同じ文字が並んでいたら1文字にまとめたい

Posted at

文字列中に同じ文字が並んでいたら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]
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0