我正在尝试构建一个程序,该程序将从列表中随机选择一个单词,并显示该单词,并用连字符替换备用字母。例如,单词“monkey”将显示为“-o-k-y”。 我可以使用 random.choice 轻松选择一个随机单词,我知道我应该使用 FOR 循环,但我似乎无法理解它。
请您参考如下方法:
有一种方法可以在不使用显式循环或正则表达式的情况下完成此任务,只需使用内置的 str 方法。这有点棘手,所以我将分阶段解释它是如何工作的。
首先,我们可以使用扩展切片表示法获取序列中的每第二个项目。这通常用于列表或元组,但它也适用于字符串。例如,
>>> 'abcdef'[::2]
'ace'
>>> 'abcdefg'[::2]
'aceg'
>>> 'abcdefg'[1::2]
'bdf'
我们可以使用 str.join 将一系列字符连接在一起方法。我们调用 .join 的字符串用作 .join 的 arg 中项目之间的分隔符。这主要用于将一系列字符串连接在一起,但它也适用于单个字符串。例如,
>>> '-'.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 上测试了这段代码,它运行良好,但请记住,使用未记录的功能通常不是一个好主意,因为它们可以更改恕不另行通知。
