在Python中循环遍历字符串中每个第n个元素

13

如何在字符串中迭代每个第二个元素?

有一种方法可以做到这一点(如果我想迭代每个第n个元素):

sample = "This is a string"
n = 3 # I want to iterate over every third element
i = 1
for x in sample:
    if i % n == 0:
        # do something with x
    else:
        # do something else with x
    i += 1

有没有任何“Pythonic”方式来做这件事?(我相当确定我的方法不好)

有没有一种“Pythonic”的方法来完成这个任务?(我很确定我的方法不好)

3
for i,x in enumerate(sample,1): 的意思是使用 Python 中的 enumerate 函数对列表 sample 进行迭代,其中 i 表示迭代元素的索引(从 1 开始),x 表示迭代元素的值。 - Jean-François Fabre
4个回答

20

如果你想迭代每个第二个元素,可以这样做:

例如,你可以使用step,如sample[start:stop:step]

sample = "This is a string"

for x in sample[::2]:
    print(x)

输出

T
i

s
a
s
r
n

它并不回答“对于每个偶数项执行某些操作,对于每个奇数项执行其他操作”的要求。 - Jean-François Fabre
@Jean-FrançoisFabre 是的,但它仍然有用,并且部分回答了我的问题。 - Agile_Eagle

14

如果你想在每n步执行某些操作,而在其他情况下执行其他操作,你可以使用enumerate获取索引,然后使用模运算:

sample = "This is a string"
n = 3 # I want to iterate over every third element
for i,x in enumerate(sample):
    if i % n == 0:
        print("do something with x "+x)
    else:
        print("do something else with x "+x)

请注意,这里的起始索引值为0而不是1。如果您需要其他数字作为起始索引,请为 i 添加偏移量。
要仅迭代每个第n个元素,最好的方法是使用itertools.islice避免创建一个“硬”字符串来进行迭代:
import itertools
for s in itertools.islice(sample,None,None,n):
    print(s)

结果:

T
s
s

r
g

1
这是最全面的答案。 - Agile_Eagle

1

打印每第n个字符的逻辑:

#Sample input = 'abcdefghijkl'
#n = 4
for i in range(0,4):
    for x in input[i::4]:
        print(x, end='')

输出:

aeibfjcgkdhl

0

尝试使用slice

sample = "This is a string"
for i in sample[slice(None,None,2)]:
   print(i)

输出:

T
i

s
a
s
r
n

3
sample[slice(None,None,2)]sample[::2] 是相同的。在这种情况下使用 slice 并没有什么实际用处,它仍然会创建一个子列表。 - Jean-François Fabre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接