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