翻转字符python

时间:2015-12-10 02:38:09

标签: python

我正在尝试编写一个函数,该函数随机翻转除第一个和最后一个字符之外的单词的两个字母。例如,如果用户输入"初学者"输出将是" begnnier"翻转的唯一两个字符是in。这就是我到目前为止所拥有的。问题是我的功能翻转了所有角色,而不仅仅是两个角色。

from random import randint

def scramble(word):
    result = word[0]

    if len(word) > 1:
        for i in range(len(word) - 2, 0, -1):
            result += word[i]

        result += word[len(word) - 1]

    return result


def main():
    while True:
      word = input("Please enter a word, type Q to quit the program")
      if word == "Q":
          break
      print(scramble(word))

main()

4 个答案:

答案 0 :(得分:2)

使用random并在其他答案中拼接字符串或转换为列表,交换,然后转换回字符串。

import random
def swap_two_chars(s):
    if len(s) <= 3:
        return s
    i,j = random.sample(range(1, len(s)-1), 2)
    sl = list(s)
    sl[i], sl[j] = sl[j], sl[i]
    return ''.join(sl)

if __name__ == "__main__":
    import sys
    print(swap_two_chars(sys.argv[1]))

答案 1 :(得分:1)

使用random模块。具体而言,random.randint

import random

def scramble(word):
    i = random.randint(1, len(word) - 2)
    j = random.randint(1, len(word) - 3)
    if j >= i:
        j += 1

    if j < i:
        i, j = j, i

    return word[:i] + word[j] + word[i + 1:j] + word[i] + word[j + 1:]

范围(1, len - 2)(包括两者)将导致索引既不是第一个也不是最后一个字符。

答案 2 :(得分:0)

(+)运算符将列表或字符串(在您的情况下)附加到左侧列表或字符串。在你的代码字中,字符追加到后面的结果,因此它看起来像是在掠过。

在使用字符串时,使用像[i:j]这样的切片通常是一种很好的做法,而不是逐字解析字符串字符。

以下代码示例显示了切片的使用。大多数时候有一种pythonic方式来做这样的操作。使用切片,解析器和正则表达式而不是大量的循环和索引,是更简单和更好的解决方案。

from random import randint

st = "beginner"

while True:
    i = randint(0,len(st)-1)
    j = randint(0,len(st)-1)
    if i>j:
        i,j = j,i   # swaps i and j
    elif i==j:
        continue
    print i,j
    print st[:i] + st[j] + st[i+1:j] + st[i] + st[j+1:]

这里i和j是范围为(0,字符串长度)的随机整数。

答案 3 :(得分:-1)

我会使用正则表达式

import re
from random import randint

def scramble(word):
    first_group = randint(0,len(word)-2)
    second_group = randint(0,len(word)-2-first_group)
    pattern = "(.{%d})(.)(.{%d})(.)(.*)" % (first_group, second_group)
    print pattern
    scrambled = re.search(pattern, word)
    print "%s%s%s%s%s" % (scrambled.group(1),scrambled.group(4),scrambled.group(3),scrambled.group(2),scrambled.group(5))