我不知道下面的代码出了什么问题。循环遍历列表中的所有元素,但只重复第一个输出。
我正在尝试将偶数索引字符和奇数索引字符打印为单行上的空格分隔字符串。
示例:
animals=[‘lephant’,‘monkey’,‘tiger’]
我的代码正在打印下面的
输出[33]:
eehn lpat
eehn lpat
eehn lpat
输出应为:
eehn lpat
mne oky
tgr ie
这是我的python 2代码:
animals = ['elephant', 'monkey', 'tiger']
w=0
even=""
odd=""
for animal in animals:
while (w<len(animal)):
if (w%2==0):
even=even+animal[w]
if (w%2!=0):
odd=odd+animal[w]
w=w+1
print even+' '+odd
谢谢你的帮助!
这是因为您只在顶部分配w
一次。您应该每次在for
循环中分配它。与CCD_ 3和CCD_。
记住在animals
:中的每个animal
之后重置循环变量
>>> w=0
>>> even=""
>>> odd=""
>>>
>>>
>>> for animal in animals:
... while (w<len(animal)):
... if (w%2==0):
... even=even+animal[w]
... if (w%2!=0):
... odd=odd+animal[w]
... w=w+1
... print even+' '+odd
... w = 0
... even = ""
... odd = ""
...
eehn lpat
mne oky
tgr ie
>>>
切片
当你遇到一个问题,你必须从Python为你准备的序列中选择元素,比如偶数和奇数,这就减轻了对显式循环的需求,并提供了一种更简洁的表示法,切片表示法。
l = [3 ,7, 4, 5, 1, 9]
l[2] # 4
l[2:3] # [4]
注意,使用普通索引可以获得序列的一个元素,使用切片表示法可以获得一个新的列表,在我们的示例中,它包含第二个和第三个分隔符之间的元素
_ 3 _ 7 _ 4 _ 5 _ 1 _ 9 _
0 1 2 3 4 5 6
^^^
slice表示法使用了许多默认值,例如,如果您没有指定边界,它从第0个到最后一个分隔符,或者以类似的方式
l[:] # a copy of l
l[:3] # [3, 7, 4]
l[3:] # [5, 1, 9]
最终您可以指定一个步骤
l[0:6:2] # [3, 4, 1]
或者,更简单的
l[::2] # [3, 4, 1]
当您从1
开始并使用步骤2时会发生什么?
l[1::2] # [7, 5, 9]
考虑到切片表示法也适用于字符串,您可以使用它来解决所有此类问题。
Slice表示法还有一个从序列末尾开始计数的快捷方式(负数),但这与您的问题无关,所以我不详细解释
切片和您的问题
当您使用切片表示法,也适用于字符串,在Python 2中,您有
animals = ['elephant', 'monkey', 'tiger']
odd_even = [a[0::2]+' '+a[1::2] for a in animals]
print 'n'.join(odd_even)
在这里,您可以在打印前将不同的字符串与'n'
(即换行符)连接在一起。
在Python 3中,它要么是
animals = ['elephant', 'monkey', 'tiger']
odd_even = [a[0::2]+' '+a[1::2] for a in animals]
print('n'.join(odd_even))
与Python 2或非常相似
animals = ['elephant', 'monkey', 'tiger']
odd_even = [a[0::2]+' '+a[1::2] for a in animals]
print(*odd_even, sep='n')
在哪里使用
sep
关键字参数到print
,以使打印项目用换行符分隔*sequence
语法,您可以在函数调用中使用它来表示序列的元素必须展开,并作为单独的参数传递给被调用的函数