有一个简单的列表,例如
my_list = ['a', 'b', 'b', 'c', 'c']
我想通过my_list[1:]
和for
循环来获得每次迭代的前一个元素值:
for i in my_list[1:]:
print(my_list[my_list.index(i)-1])
我希望在输出中看到a b b c
,但却得到了a a b b
。我想这是因为index()
方法只搜索第一个i
值,忽略了有两个元素"b"
和两个"c"
。。。
如何修复此代码以获得预期的输出?
list.index()
方法将返回其参数第一次出现的索引。由于你的列表中有多个重复的项目,所以它不会给你带来预期的结果。您可以使用一个简单的切片来获得预期的输出:
>>> my_list = ['a', 'b', 'b', 'c', 'c']
>>>
>>> my_list[:-1]
['a', 'b', 'b', 'c']
或者,如果您想通过循环访问这些项目,您可以使用zip()
函数,如下所示:
>>> for i, j in zip(my_list,my_list[1:]):
... print(i, j)
...
a b
b b
b c
c c
将元素与其前置或successor匹配是zip:的常见用例
In [13]: for i,prior in zip(my_list[1:], my_list[0:]):
print (prior)
....:
a
b
b
c
您可以始终模拟C/Pascal/PPerl/whatever'for'的行为,而不是Python的'for'(实际上更像foreach)。请注意,范围从1开始,以避免在第一次迭代中返回最后一个元素。
for i in range(1, len(my_list)):
print(my_list[i], my_list[i-1])
不太像Python,但对于有其他语言背景的人来说,这种方法有时更直观。
正如您所注意到的,使用index
在这里不起作用,因为它总是找到给定元素的第一个位置。此外,这是相当浪费的,因为在最坏的情况下,你每次都必须搜索整个列表。
您可以使用enumerate
和start
参数来获得元素及其索引:
start = 1
for i, x in enumerate(my_list[start:], start):
print(i, x, my_list[i-1]) # index, current, last
这将完成任务:
for i in range(len(my_list)+1):
try: print(my_list[i-1])
except: print 'it is 1st iteration'