1

我有一个字符串被分成成对的字母,我正在寻找一种方法来摆脱所有相同的字母对,通过在它们之间插入字符来形成新的对。此外,我希望一次将它们分成一对。到目前为止,我设法做的是同时拆分所有相同的块,但这不是我想要的。因此,例如,考虑“免费树”。这应该去“fr eX et re e”,而不是“fr eXe tr eXe”。

有人有什么想法吗?

编辑:为了更清楚,我需要遍历字符串,并在“双块”的第一个实例中插入一个 X,并在 X 右侧的所有内容上形成新的对。所以。“AA BB”,转到“AX AB B”。

到目前为止我有

def FUN(text):
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] + "X" + text[i]
    else:
        result += text[i-1:i+1]

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

return result
4

5 回答 5

1

这个怎么样 ?:

r = list()
S = "free tree"
S = "".join(S.split())
s = list()
for i in range(0,len(S)) :
    s.append(S[i])
while len(s) > 0 :
    c1 = s.pop(0)
    c2 = 'X'
    if len(s) > 0 :
        if s[0]!=c1 :
            c2 = s.pop(0)
    else :
        c2 = ''
    r.append("{0}{1}".format(c1,c2))
result = " ".join(r)
print(result)

希望这可以帮助 :)

于 2013-10-30T19:09:08.333 回答
0
my_string = "freetreebreefrost"
my_parts = [my_string[i:i+2] for i in range(0,len(my_string),2)]
final_list = []
while len(my_parts):
    part = my_parts.pop(0)
    if part in my_parts:
       tmp_str = part[1] +"".join(my_parts)
       my_parts = [tmp_str[i:i+2] for i in range(0,len(tmp_str),2)]
       final_list.append(part[0]+"X")
    else:
       final_list.append(part)

print final_list

可能有一种更酷的方法来做到这一点

于 2013-10-30T19:13:31.850 回答
0

这是一个简单的 3 行代码解决方案,单遍,非常简单。
没有拆分、连接、数组、for 循环,什么都没有。

  1. 首先,删除字符串中的所有空格,Replace_All \s+with ""

  2. 用回调((.)(?:(?!\2)(.)|)(?!$))
    a 替换_All。if (matched $3) 替换为 $1
    b。否则替换为 $1+"X"

  3. 最后,在每 2 个字符之间放置一个空格。将_All(..)替换为 $1 + " "

这是一个使用 Perl 的测试(不太了解 Python)

 $str = 'ee ee rx xx tt bb ff fr ee tr ee';

 $str =~ s/\s+//g;
 $str =~ s/((.)(?:(?!\2)(.)|)(?!$))/ defined $3 ? "$1" : "$1X"/eg;
 $str =~ s/(..)/$1 /g;

 print $str,"\n";

 # Output:     
 # eX eX eX er xX xX xt tb bf fX fr eX et re e

 # Expanded regex
 #
 (                        # (1 start)
      ( . )               # (2)
      (?:
           (?! \2 )       # Not equal to the first char?
           ( . )          # (3) Grab the next one
        |  
                          # or matches the first, an X will be inserted here
      )
      (?! $ )
 )                        # (1 end)
于 2013-10-30T19:52:09.980 回答
0

您可以将字符串转换为列表并在循环中检查每个配对,然后在找到相同字符的位置之间插入另一个字符。现在处理代码将进行编辑。

于 2013-10-30T18:57:53.900 回答
0

好的,这里是:

s = "free tree aa"

def seperateStringEveryTwoChars(s):
    # get rid of any space
    s = s.replace(' ', '')
    x = ""
    for i, l in enumerate(s, 0):
        x += l
        if i % 2:
            x += ' '
    return x.rstrip()

def findFirstDuplicateEntry(stringList):
    for i, elem in enumerate(stringList, 0):

        if len(elem) > 1 and elem[0] == elem[1]:
            return i
    return None

def yourProgram(s):

    x = seperateStringEveryTwoChars(s)
    # print x  # debug only
    splitX = x.split(' ')
    # print splitX  # debug only
    i = findFirstDuplicateEntry(splitX)
    if i == None:
        return seperateStringEveryTwoChars(s)
    # print i  # debug only
    splitX[i] = splitX[i][0] + "X" + splitX[i][1]

    # print splitX  # debug only

    s = ''.join(splitX)
    # print s  # debug only
    # print "Done"  # debug only
    return yourProgram(s)

print yourProgram(s)

输出:

fr eX et re ea

输入“aabbccddd”字符串,它将输出“aX ab bc cd dX d”

于 2013-10-30T19:14:19.943 回答