我想知道如何在不使用任何内置函数的情况下编写用单词替换字母的函数。例如,eyeForI(“William”)
返回“Weyelleyeam”
,用i
替换每个eye.
我知道如何使用内置函数执行此操作,我已经在此处编写了类似的内容(尽管在这种情况下,它会使用不同的单词更改单词):
def stringChange(s):
for old, new in (
("can't", "can not"),
("shouldn't", "should not"),
("don't", "do not"),
("won't", "will not"),
):
s = s.replace(old, new)
if "!" in s:
s=s.upper()
return s
但我不知道如何在不使用任何内置函数的情况下编写它。
我知道我必须使用for
循环。
答案 0 :(得分:3)
字符串是不可变的,因此您需要将其转换为列表,进行更改,然后转换回字符串。对于你的例子,
def eyeForI(word):
word = list(word)
j = 0
while j < len(word):
if word[j] == 'i':
word[j] = 'eye'
j += 1
word = ''.join(word)
return word
如果您只是学习控制结构,值得一提的是,这也可以使用for
循环而不是while
循环来完成。
def eyeForI(word):
# convert the string word into a list
# word = ['W', 'i', 'l', 'l', 'i', 'a', 'm']
word = list(word)
# loop over indices of the list. len(word) = 7 so i runs from 0-6
for j in xrange(len(word)):
if word[j] == 'i': # if the j'th item in word == "i"
word[j] = 'eye' # change it to "eye"
word = ''.join(word) # join method, explained below
return word
join
方法最初可能会令人困惑。它将使用调用它作为分隔符的字符串(在本例中为word
)连接其参数的所有元素(在本例中为''
)。所以我们只是说,“使用空字符串连接单词元素来分隔它们。”请注意,您还可以使用+
运算符从头开始构建另一个字符串,并根据需要迭代原始word
字符串(请参阅其他答案)。
答案 1 :(得分:2)
这里有一些东西供您尝试拆解。它不是for循环,而是涉及生成器,带有get
默认参数的字典和join
。您可以遍历字符串,这意味着您不需要先将其转换为列表。
s1 = "William"
subs = {'i': 'eye'}
s2 = ''.join(subs.get(c, c) for c in s1)
print(s2)
这是一个不会调用任何合理称为函数或方法的解决方案。它不是非常&#34; pythonic&#34;然而。由于条件的硬编码而难以延长,并且不优选重复添加弦。
def eyeForI(word):
result = "" # create an empty string so we can add to it
for c in word: # c will be set to each character in turn
if c == 'i':
result += 'eye' # add the word to the end of result
else:
result += c # add the letter to the end of result
return result
assert eyeForI("William") == "Weyelleyeam" # test it works
答案 2 :(得分:2)
我喜欢列表理解:)
您可以创建字母列表:
>>> print [letter if letter is not 'i' else 'eye' for letter in "william" ]
['w', 'eye', 'l', 'l', 'eye', 'a', 'm']
并使用join
函数将它们组合在一起:
>>> print "".join([letter if letter is not 'i' else 'eye' for letter in "william" ])
weyelleyeam