0

文字列が与えられた場合、n、n + 1 (n は偶数) で連続する同一文字がないように分割するにはどうすればよいですか。

つまり、「abba」を「abba」のままにし、「abbb」を「abbXb」にするにはどうすればよいですか。

ありがとう

4

4 に答える 4

1

誰もがワンライナーを愛しているからです:

strings = ['ab', 'abba', 'abbb', 'abbba', 'abbababababbbaaaa', 'abcacbbbddbabbdd']

for s in strings:
    r = ''.join('X' + v if (k and k % 2 and v == s[k - 1]) else v for (k,v) in enumerate(s))
    print s, '->', r

コードは次のようになります。文字列内のすべての文字を調べます。それが最初ではなく、インデックスが偶数で、前の文字と同じである場合は、文字の先頭に an'X'を追加します。

出力:

ab -> ab
abba -> abba
abbb -> abbXb
abbba -> abbXba
abbababababbbaaaa -> abbababababXbbaaXaa
abcacbbbddbabbdd -> abcacbbXbdXdbabXbdXd
于 2013-10-30T13:12:10.913 に答える
0

いいかも?

from itertools import izip_longest

def X(s):
    s_odd = s[::2]
    s_even = s[1::2]
    output = ''
    for o, e in izip_longest(s_odd, s_even):
        output += o or ''
        if o == e:
            output += 'X'
        output += e or ''
    return output

strings = ['ab', 'abba', 'abbb', 'abbba', 'abbababababbbaaaa', 'abcacbbbddbabbdd']
for s in strings:
    print X(s)

結果:

ab
abba
abbXb
abbXba
abbababababXbbaaXaa
abcacbbXbdXdbabXbdXd

編集

より単純なバージョン:

def X(s):
    output = ''
    for i in range(0, len(s), 2):
        o = s[i]
        e = s[i+1] if i < len(s) - 1 else ''
        output += o
        if o == e:
            output += 'X'
        output += e
    return output

strings = ['ab', 'abba', 'abbb', 'abbba', 'abbababababbbaaaa', 'abcacbbbddbabbdd']
for s in strings:
    print X(s)
于 2013-10-30T13:24:22.070 に答える
0

宿題は自分でやれ、ケビン。

def foo(text, separator):
    if len(text) < 2:
        return text

    result = ""
    for i in range(1, len(text), 2):
        if text[i] == text[i - 1]:
            result += text[i - 1] + separator + text[i]
        else:
            result += text[i-1:i+1]

    if len(text) % 2 != 0:
        result += text[-1]

    return result

print(foo("ab", "X"))
print(foo("abba", "X"))
print(foo("abbba", "X"))
print(foo("abbababababbbaaaa", "Z"))

出力:

>> ab
>> abba
>> abbXba
>> abbababababZbbaaZaa
于 2013-10-30T13:07:59.930 に答える
0

使用できますitertools.groupby

from itertools import islice, groupby
import math
def solve(strs, n):
    for k, g in groupby(strs):
        lis = list(g)
        it = iter(lis)
        yield 'X'.join(''.join(islice(it, n)) for _ in xrange(int(math.ceil(len(lis)/float(n)))))

デモ:

>>> ''.join(solve("abba", 2))
'abba'
>>> ''.join(solve("abbb", 2))
'abbXb'
>>> ''.join(list(solve('abbbbyyyyy', 2)))
'abbXbbyyXyyXy'
>>> ''.join(solve('abbbbyyyyy', 4))
'abbbbyyyyXy'
于 2013-10-30T13:08:16.933 に答える