[英]Enumerate over string instead of iterating with range() and len()
我编写了一个函数,该函数返回一个由第一个字符开始的第二个字符组成的新字符串。
因此,例如“ Pizza”产生“ Pza”,“ Maogtbhdewr”产生“ Mother”。
这段代码带有range()
和len()
:
def string_skip(string):
new_string = ""
for n in range(0, len(string)):
if n % 2 == 0:
new_string += string[n]
return new_string
上面的代码按预期工作。 但是pylint
显示了一条信息,建议使用enumerate()
而不是使用range()
和len()
进行迭代。 因此,我试图在没有两个内置插件的情况下重写代码,并且还阅读了文档。 但是我仍然无法正常工作。
我的问题:如何使用enumerate()
而不是range()
和len()
?
是的,您可以,字符串也是可迭代的。
def string_skip(string):
new_string = ""
for i, n in enumerate(string):
if i % 2 == 0:
new_string += n
return new_string
s="Pizza"
s[::2]
Out[3]: 'Pza'
您甚至不需要范围和len甚至枚举
试试这个功能:
def string_skip(st):
return ''.join([j for i, j in enumerate(x) if not i % 2])
for i, j in enumerate(string)
只需解压缩以下内容:
0, string[0]
1, string[1]
2, string[2]
...
>>> for i, j in enumerate('Pizza'):
... print i, j
...
0 P
1 i
2 z
3 z
4 a
>>>
正如@attersson指出的那样,您可以依靠Python序列的切片功能(可以索引的任何内容):
>>> s = "Pizza"
>>> s[::2]
'Pza'
您不仅可以索引一个字符( s[2]
或一系列字符( s[2:4]
),还可以指定使用方括号之间的第三个值进行迭代时要使用的步骤 。
总之,Python中的索引用作[start:stop:step]
,其中start是包含在内的,而stop是排斥的。 默认情况下, start=0
, stop=len(...)
和step=1
:
>>> s[2]
'z'
>>> s[2:4]
'zz'
>>> s[1::2]
'iz'
现在,如果您真的想使用枚举,则可以依赖产生的索引:
>>> for i, letter in enumerate(s):
>>> if i % 2 == 0:
>>> print(letter)
只需使用:
def str_func(mystr):
newstr = ''
for i, char in enumerate(mystr):
if not i%2:
newstr+=char
return newstr
如果您特别喜欢,可以使用列表理解并join
:
def str_func(mystr):
return "".join([char for i,char in enumerate(mystr) if not i%2 ])
试试这个:
def string_skip_2(string):
string = list(string)
new_string = ''
for i in range(len(string)):
if int(list(enumerate(string))[i][0]) % 2 == 0:
new_string += list(enumerate(string))[i][1]
return new_string
为了提供另一种选择,它对元素进行类似于枚举的迭代,但更为优雅:
def string_skip(string):
new_string = ""
iterator = iter(string)
for letter in iterator:
new_string += letter
next(iterator)
return new_string
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.