枚举字符串而不是使用 range() 和 len() 进行迭代
Enumerate over string instead of iterating with range() and len()
我写了一个函数,returns 一个新字符串,由第一个字符开始的每隔一个字符组成。
因此,例如 "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()
?
s="Pizza"
s[::2]
Out[3]: 'Pza'
你甚至不需要 range 和 len 甚至 enumerate
试试这个功能:
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
>>>
是的,你可以,字符串是可迭代的。
def string_skip(string):
new_string = ""
for i, n in enumerate(string):
if i % 2 == 0:
new_string += n
return new_string
只需使用:
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
正如@attersson 所指出的,您可以依赖 Python 序列(任何可以索引的内容)的 slicing 能力:
>>> s = "Pizza"
>>> s[::2]
'Pza'
您可以指定 step,而不是仅索引一个字符 (s[2]
) 或一系列字符 (s[2:4]
)迭代方括号之间的第三个值。
总而言之,Python 中的索引工作方式与 [start:stop:step]
一样,其中开始包含在内,停止包含在内。默认情况下 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 string_skip(string):
new_string = ""
iterator = iter(string)
for letter in iterator:
new_string += letter
next(iterator)
return new_string
我写了一个函数,returns 一个新字符串,由第一个字符开始的每隔一个字符组成。
因此,例如 "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()
?
s="Pizza"
s[::2]
Out[3]: 'Pza'
你甚至不需要 range 和 len 甚至 enumerate
试试这个功能:
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
>>>
是的,你可以,字符串是可迭代的。
def string_skip(string):
new_string = ""
for i, n in enumerate(string):
if i % 2 == 0:
new_string += n
return new_string
只需使用:
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
正如@attersson 所指出的,您可以依赖 Python 序列(任何可以索引的内容)的 slicing 能力:
>>> s = "Pizza"
>>> s[::2]
'Pza'
您可以指定 step,而不是仅索引一个字符 (s[2]
) 或一系列字符 (s[2:4]
)迭代方括号之间的第三个值。
总而言之,Python 中的索引工作方式与 [start:stop:step]
一样,其中开始包含在内,停止包含在内。默认情况下 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 string_skip(string):
new_string = ""
iterator = iter(string)
for letter in iterator:
new_string += letter
next(iterator)
return new_string