Python2.7 - 迭代字符串索引并仅打印偶数或奇数索引值时输出不正确

时间:2016-12-20 17:05:05

标签: python indexing

当迭代字符串并仅打印偶数字符串索引的值时,Python会在string.index(3)处打印该值,即使我要求它仅在索引为偶数时打印该值。我想知道为什么会这样。这是我一直在使用的代码:

    my_string = 'Hello, World!'
    for i in my_string:
        if my_string.index(i) % 2 == 0:
            print i
        else:
            print my_string.index(i)

当我们运行代码时,它应该返回:

H
1
l
3
o
5

7
o
9
l
11
!

然而,Python正在回归:

H
1
l
l 
o
5

7
o
9
l
11
!

如您所见,索引[3]处的'l'正在返回而不是3。

在我使用的每个解释器中都是如此,所以我认为这是Python的一个问题。有办法解决这个问题吗?是否发生在其他人身上?如果有人正在编写一个需要准确分离偶数和奇数索引的程序,这似乎是一个非常大的问题。

4 个答案:

答案 0 :(得分:4)

.index没有按照您的想法执行操作 - 它会返回第一个索引。在你的情况下,你有:

 Hello... # text
 01234    # indices

l的第一个索引是2。这是偶数,而不是显示。您想要使用的是enumerate

my_string = 'Hello, World!'
for i, char in enumerate(my_string):
    if i % 2 == 0:
        print char
    else:
        print i

如果你read the docs,你会看到:

  

s.index(x)| s中第一次出现x的索引

您也可以尝试这种方式:

Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.
Type "help", "copyright", "credits" or "license" for
>>> help('hello'.index)
Help on built-in function index:

index(...)
    S.index(sub [,start [,end]]) -> int

    Like S.find() but raise ValueError when the substring is not found.

(应该引导你

>>> help('hello'.find)
Help on built-in function find:

find(...)
    S.find(sub [,start [,end]]) -> int

    Return the lowest index in S where substring sub is found,
    such that sub is contained within S[start:end].  Optional
    arguments start and end are interpreted as in slice notation.

    Return -1 on failure.
  

S

中的最低指数

'Hello, World!'l最低索引为2. o的最低索引为4.如果您接受了代码并将逻辑翻转为if i % 2:然后您会看到第4o获得$(document).ready(function() { function myAnimate1(x) { $(x) .animate({ top: "150px", left: "150px", height: "0px", width: "0px" }) .animate({ top: "100px", left: "100px", height: "100px", width: "100px" }, 'slow', function() { // move this into callback function of last animation myAnimate1(x); }) } function myAnimate2(x) { $(x) .animate({ top: "150px", left: "150px", height: "0px", width: "0px" }) .animate({ top: "0px", left: "0px", height: "300px", width: "300px" }, 'slow', function() { // move this into callback function of last animation myAnimate2(x); }); } myAnimate1('.circle1'); myAnimate2('.circle2'); });

答案 1 :(得分:2)

这是因为"Hello"返回第一个匹配字符(或第一个匹配子字符串的开头)的索引,而不是当前迭代的位置。由于l有2 my_string.index('l')个字符,index, item将始终返回2,而作为偶数,则会打印字符而不是索引。

您需要的是the builtin function enumerate,它会为给定的可迭代项中的每个项目生成my_string = 'Hello, World!' for index, char in enumerate(my_string): if index % 2 == 0: print(char) else: print(index) 对:

{{1}}

答案 2 :(得分:2)

l返回其参数的第一个出现的索引; Hello, World!中有三个my_string.index('l'),但enumerate始终返回2.

改为使用for i, c in enumerate(my_string): if i % 2 == 0: print c else: print i

 String delimiters = "\t,;.?!-:@[](){}_*/";

答案 3 :(得分:0)

不要迭代sting本身,而是尝试迭代范围(len(my_string))。完整的指示是:   对于范围内的i(len(my_string): 这将使每个数字从0到1小于字符串中的字符数。然后,您可以使用i来切割字符串以获取单个字符。您还可以使用另一个范围功能的其他输入来指定启动位置(默认值= 0)和步长(默认值= 1)。   至于其余的,在你的if语句中使用i%2 == 0,打印i来打印索引,并打印my_string [i]来打印字符。