我有以下功能,但它没有给我预期的结果:
def GetNthLetters(text,n):
builtstring=""
for letter in text:
if text.index(letter)%n==0:
builtstring=builtstring+letter
print letter
return builtstring
答案 0 :(得分:2)
str.index()
找到您信件的第一场比赛。如果你的信件出现不止一次,那就会给你一个错误的索引。对于任何给定的字符,您只测试字符串中第一个出现位于第n个位置。
要演示,请查看带有字符索引的字符串'hello world'
(我使用.
标记空格):
0 1 2 3 4 5 6 7 8 9 10
h e l l o . w o r l d
对于字母l
,text.index('l')
将返回2
,因此只有在n
为1
或{{{{}}}时才会将其包含在输出中1}}。 2
也出现在索引3或9处并不重要,因为您只测试l
。这同样适用于2 % n == 0
(位置4和7),只测试了'o'
。
您可以使用enumerate()
function为您提供正在运行的索引:
4 % n == 0
现在def GetNthLetters(text, n):
builtstring = ""
for index, letter in enumerate(text):
if index % n == 0:
builtstring = builtstring + letter
return builtstring
对于每个重复或不重复的字母都是正确的。
然而,使用切片会更容易:
index
这也是每个第n个字母:
def GetNthLetters(text, n):
return text[::n]
答案 1 :(得分:1)
如果有人要我给字符串中的每个第n个字符,我就不会包含第一个字符。我宁愿做下面的事情:
def GetNthLetters(text, n):
builtstring = ""
for i in range(0, len(text)):
if (i + 1) % n == 0:
# print(text[i])
builtstring = builtstring + text[i]
return builtstring
text = '1234567890123456789012345678901234567890'
nthLetters = GetNthLetters(text, 1)
print(nthLetters)
nthLetters = GetNthLetters(text, 2)
print(nthLetters)
nthLetters = GetNthLetters(text, 3)
print(nthLetters)
nthLetters = GetNthLetters(text, 10)
print(nthLetters)
nthLetters = GetNthLetters(text, 40)
print(nthLetters)
这会产生以下结果:
1234567890123456789012345678901234567890
24680246802468024680
3692581470369
0000
0
答案 2 :(得分:0)
myJs
希望这会有所帮助。!
答案 3 :(得分:0)
slicing
语法: Python的slicing
语法与range()
函数非常相似。它接受start
,stop
和step
值:
string[start : stop : step]
您可以将任何参数留空,它们将默认为0
,字符串的长度和1
。
这意味着您可以:
string[::n
]
获取每个nth
字符串的字符串。
所以你可以把function
写成:
def getNthLetters(text, n):
return text[::n]
希望这可以做你想要的!
答案 4 :(得分:0)
代码的问题是每次相同重复字母的索引都会给出相同的结果。
例如' Hello World!' .index(' o')将始终为4,因此不会给出预期的结果。
最好的方法是enumerate
for循环。所以你会得到合适的索引。
你还应该记住数组以0而不是1开始。