簡體   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