当迭代字符串并仅打印偶数字符串索引的值时,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的一个问题。有办法解决这个问题吗?是否发生在其他人身上?如果有人正在编写一个需要准确分离偶数和奇数索引的程序,这似乎是一个非常大的问题。
答案 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:
然后您会看到第4
个o
获得$(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]来打印字符。