Python程序通常简洁明了,通常需要其他编程语言(我知道)中的一堆行可以在python中用一行或两行完成。 我试图编写的一个这样的程序是从字符串中提取所有其他字母。 我有这个工作代码,但想知道是否有其他简洁方法可以吗?
>>> s
'abcdefg'
>>> b = ""
>>> for i in range(len(s)):
... if (i%2)==0:
... b+=s[i]
...
>>> b
'aceg'
>>>
答案 0 :(得分:24)
>>> 'abcdefg'[::2]
'aceg'
答案 1 :(得分:13)
使用Explain Python's slice notation:
>>> 'abcdefg'[::2]
'aceg'
>>>
切片表示法的格式为[start:stop:step]
。所以,[::2]
告诉Python按2的顺序逐步执行字符串(将返回其他每个字符)。
答案 2 :(得分:3)
正确的方法是将字符串切片,就像在其他答案中一样。
但是如果你想要一种更简洁的方式编写你的代码,这对于类似于切片这样简单的问题很有用,那么有两个技巧:comprehensions,和enumerate
函数。
首先,这个循环:
for i in range(len(foo)):
value = foo[i]
something with value and i
...可以写成:
for i, value in enumerate(foo):
something with value and i
所以,在你的情况下:
for i, c in enumerate(s):
if (i%2)==0:
b+=c
接下来,任何以空对象开头的循环都会经过迭代(字符串,列表,迭代器等),并将值放入新的可迭代中,可能通过if
过滤器运行值或变换它们的表达式可以很容易地变成一种理解。
虽然Python对列表,集合,dicts和迭代器有所了解,但它没有对字符串的理解 - 但是str.join
解决了这个问题。
所以,把它放在一起:
b = "".join(c for i, c in enumerate(s) if i%2 == 0)
不像b = s[::2]
那样简洁或可读......但比你开始时要好得多 - 当你想要做更复杂的事情时,同样的想法也有效,比如if i%2 and i%3
(没有'{ t映射到任何明显的切片),或者用c*2
将每个字母加倍(这可以通过将两个切片压缩在一起来完成,但这并不是很明显),等等。
答案 3 :(得分:0)
您可以尝试使用切片并加入:
>>> k = list(s)
>>> "".join(k[::2])
'aceg'
答案 4 :(得分:0)
实际上,切片是最好的方法。但是,也有一些方法可以改进现有的代码,而不是缩短它,而是通过使它变得更像Pythonic:
>>> s
'abcdefg'
>>> b = []
>>> for index, value in enumerate(s):
if index % 2 == 0:
b.append(value)
>>> b = "".join(b)
甚至更好:
>>> b = "".join(value for index, value in enumerate(s) if index % 2 == 0)
这可以很容易地扩展到更复杂的条件:
>>> b = "".join(value for index, value in enumerate(s) if index % 2 == index % 3 == 0)
答案 5 :(得分:0)
这是列表和字符串的另一个示例:
sentence = "The quick brown fox jumped over the lazy dog."
sentence[::2]
在这里我们说的是:从头到尾取整个字符串,并返回第2个字符。
将返回以下内容:
'Teqikbonfxjme vrtelz o.'
您可以对列表执行相同操作:
colors = ["red", "organge", "yellow","green", "blue"]
colors[1:4]
将重新运行:
['organge', 'yellow', 'green']
我阅读切片的方式是:如果我们有sentence[1:4]
从索引1开始(记住起始位置是索引0),然后在索引4之前停止