[英]Replacing every 2nd character in a string
我正在尝试构建一个程序,该程序将从列表中选择一个随机单词,并显示该单词以及用连字符替换的替代字母。 例如,单词“ monkey”将显示为“ -oky”。 我可以使用random.choice得到一个很容易选择的随机词,我知道我应该使用一个FOR循环,但是我似乎无法绕开它。
仅使用内置的str
方法,就有一种无需使用显式循环或正则表达式即可执行此任务的方法。 这有点棘手,所以我将分阶段解释它的工作方式。
首先,我们可以使用扩展切片符号获得序列中的每个第二项。 通常用于列表或元组,但也可以用于字符串。 例如,
>>> 'abcdef'[::2]
'ace'
>>> 'abcdefg'[::2]
'aceg'
>>> 'abcdefg'[1::2]
'bdf'
我们可以使用str.join
方法将一系列字符连接在一起。 我们在.join
上使用的字符串用作arg到.join
项目之间的分隔符。 这通常用于将一系列字符串连接在一起,但也适用于单个字符串。 例如,
>>> '-'.join('abcdef')
'a-b-c-d-e-f'
>>> '-*-'.join('abcdef')
'a-*-b-*-c-*-d-*-e-*-f'
对于此任务有用的另一种方法是str.ljust
。 这种方法允许我们使用我们选择的字符将字符串填充到给定的长度(默认填充字符为ASCII空格)。 原始字符位于输出字符串的左侧,填充被添加到右侧。 如果字符串长于请求的长度,则将其返回原样。
>>> 'abcd'.ljust(6, '-')
'abcd--'
>>> 'abcdef'.ljust(4, '-')
'abcdef'
我们可以使用这些工具执行您想要的字符串转换。
>>> 'monkey'[1::2]
'oky'
>>> '-'.join('monkey'[1::2])
'o-k-y'
>>> '-' + '-'.join('monkey'[1::2])
'-o-k-y'
到现在为止还挺好。 但是当单词的长度为奇数时,它并不能完全起作用:
>>> '-' + '-'.join('gorilla'[1::2])
'-o-i-l'
那应该有最后的破折号。 但是我们可以使用.ljust
来解决此问题:
>>> word = 'gorilla'
>>> s = '-' + '-'.join(word[1::2])
>>> s.ljust(len(word), '-')
'-o-i-l-'
让我们用几个不同的词来测试一下。
words = 'Here are some short test words monkey gorilla'.split()
for word in words:
dashed = ('-' + '-'.join(word[1::2])).ljust(len(word), '-')
print(word, dashed)
输出
Here -e-e
are -r-
some -o-e
short -h-r-
test -e-t
words -o-d-
monkey -o-k-y
gorilla -o-i-l-
乔恩·克莱门茨(Jon Clements)指出, str.replace
方法有一个未记录的功能,我们可以在这里使用它。 如果将空字符串作为第一个参数传递给它,它将在旧字符串的每个位置插入替换字符串。 例如:
>>> 'abcdef'.replace('', '-')
'-a-b-c-d-e-f-'
我们可以使用未记录的功能来执行您的任务,如下所示:
words = 'Here are some short test words monkey gorilla'.split()
for word in words:
dashed = word[1::2].replace('', '-')[:len(word)]
print(word, dashed)
输出与以前的版本相同,但是Jon的代码几乎是我的版本的两倍。 谢谢,乔恩!
我在Python 2.5、2.6、3.1和3.6上测试了此代码,它可以完美运行,但请记住,使用未记录的功能通常不是一个好主意,因为可以在不另行通知的情况下对其进行更改。
您可以使用正则表达式:
import re
word = re.sub(r'.(.)', r'-\1', "monkey")
用生成器表达式替换偶数索引处的字符:
>>> s
'Hello, world!'
>>> ''.join(c if i%2 else '-' for i, c in enumerate(s))
'-e-l-,-w-r-d-'
如果您希望连字符模式是随机的,则可以使用random.sample()
和range(len(s))
作为总体:
>>> n = 4
>>> mask = set(random.sample(range(len(s)), n))
{8, 1, 4, 0}
>>> ''.join('-' if i in mask else c for i, c in enumerate(s))
'--ll-, w-rld!'
您可以使用如下所示的for循环来逐个获取字符串中的每个字母:
for character in string:
然后创建一个新字符串,在每个其他字符串append
都append
'-'或character
。
尝试这个:
import random
word = random.choice(wordList)
for i in range(0, len(word), 2): ## Goes through the numbers between 0 and len(word)-1 with a step of two
word = word[ : i] + "-" + word[i + 1: ] ## Str assignment isn't supported so slicing is the best way to do this
另一个实现(使用OO的算法)是:
import random
word = random.choice(wordList)
new = ''
for i in range(len(word)):
if i%2 == 1: ## If the index is odd (which is when you want the letter to be retained)
new += word[i]
else:
new += "-"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.