如何强制Python在FOR循环中正确识别列表元素索引



有一个简单的列表,例如

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在这里不起作用,因为它总是找到给定元素的第一个位置。此外,这是相当浪费的,因为在最坏的情况下,你每次都必须搜索整个列表。

您可以使用enumeratestart参数来获得元素及其索引:

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'

最新更新