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