程序从python中的字符串中提取每个替代字母?

时间:2013-12-30 20:42:08

标签: python string

Python程序通常简洁明了,通常需要其他编程语言(我知道)中的一堆行可以在python中用一行或两行完成。 我试图编写的一个这样的程序是从字符串中提取所有其他字母。 我有这个工作代码,但想知道是否有其他简洁方法可以吗?

>>> s
'abcdefg'
>>> b = ""
>>> for i in range(len(s)):
...   if (i%2)==0:
...      b+=s[i]
... 
>>> b
'aceg'
>>> 

6 个答案:

答案 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之前停止