在python中从字符串中提取每个备用字母的程序?

在python中从字符串中提取每个备用字母的程序?,python,string,Python,String,Python程序通常简短,在其他编程语言(我知道)中通常需要一大堆行的代码,可以在Python中用一两行代码来完成。 我正在尝试编写的一个这样的程序是从字符串中每隔一个字母提取一个字母。 我有这个工作代码,但不知道是否有其他简洁的方式是可能的 >>> s 'abcdefg' >>> b = "" >>> for i in range(len(s)): ... if (i%2)==0: ... b+=s[i] ... >&

Python程序通常简短,在其他编程语言(我知道)中通常需要一大堆行的代码,可以在Python中用一两行代码来完成。 我正在尝试编写的一个这样的程序是从字符串中每隔一个字母提取一个字母。 我有这个工作代码,但不知道是否有其他简洁的方式是可能的

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


切片表示法的格式是
[开始:停止:步骤]
。因此,
[::2]
告诉Python按2的顺序遍历字符串(这将返回每一个字符)。

您可以尝试使用slice和join:

>>> k = list(s)
>>> "".join(k[::2])
'aceg'

实际上,切片是最好的方式。但是,也有一些方法可以改进现有代码,不是缩短代码,而是使其更具python风格:

>>> 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)
正确的方法是像其他答案一样,切掉字符串

但是,如果您想要一种更简洁的方法来编写代码,这种方法可以解决与切片不同的类似问题,那么有两个技巧:、和函数

首先,这个循环:

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
接下来,任何以空对象开始的循环,经过一个iterable(字符串、列表、迭代器等),并将值放入一个新的iterable,可能通过一个
if
过滤器或一个转换它们的表达式来运行值,都可以很容易地转化为理解

虽然Python有列表、集合、dict和迭代器的理解,但它没有字符串的理解,但是
str.join
解决了这个问题

所以,把它放在一起:

b = "".join(c for i, c in enumerate(s) if i%2 == 0)

虽然不如
b=s[::2]
…简洁易读,但比你开始时的想法要好得多,而且当你想做更复杂的事情时,同样的想法也能奏效,比如
如果i%2和i%3
(没有映射到任何明显的片段),或者用
c*2将每个字母加倍(这可以通过将两个切片压缩在一起来完成,但这并不明显),等等。

这里是列表和字符串的另一个示例:

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']
我读这篇文章的方式是:如果我们有
句子[1:4]

从索引1开始(记住起始位置是索引0)在索引4之前停下来

哇!这真的很简洁。虽然我知道slice是如何工作的,但我没有想到这一点。有趣的是,所有其他的答案也都使用slicenotations@eagertoLearn:。这就是为什么所有贴出的答案都是一样的。@abarnert:哈哈!这就是python的禅宗。
g因为它是我的+1-
join
ing字符串是对他当前代码的改进。如果我错了,请纠正我:您使用的不是列表理解正确;它是生成器表达式,但这是列表理解:
b=“”。join([c代表I,c在枚举中,如果I%2==0])
。当然,这里的生成器是最好的。但我只是想澄清一下。不要搞错了me@user1988876:你完全正确。使用括号(或不使用括号)生成一个生成器表达式,方括号生成一个列表理解,大括号生成一个集合或dict理解。@user1988876:另外,在传递到
str.join
的情况下,如果
str.join
从C获取一些不能快速索引的内容,实际上没有什么区别,它只是从中生成一个列表,以便快速索引it、 事实上(特别是在3.4之前),与直觉相反,listcomp甚至可能更快,占用更少的内存。但从概念上讲,我认为在不需要列表的时候不构建列表更为清晰。(而且,除非你知道
str.join
如何在幕后工作,否则你不会知道你需要它。)
colors = ["red", "organge", "yellow","green", "blue"]
colors[1:4]
['organge', 'yellow', 'green']