繁体   English   中英

替换字符串中的每个第二个字符

[英]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:

然后创建一个新字符串,在每个其他字符串appendappend '-'或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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM