Python枚举列表设置开始索引但不增加结束计数

2024-04-19 10:26:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想循环遍历一个计数器从零开始但列表索引从1开始的列表,例如:

valueList = [1, 2, 3, 4]
secondList = ['a', 'b', 'c', 'd']

for i, item in enumerate(valueList, start=1):
    print(secondList[i])

代码因索引超出范围错误而失败(我意识到这是因为我以list-1的长度加上起始值结束,并且python列表为零索引,因此以这种方式使用I调用另一个列表中的第I个元素是无效的)。下面的方法是有效的,但是添加的i大于零的测试看起来不是pythonic。

valueList = [1, 2, 3, 4]
secondList = ['a', 'b', 'c', 'd']

for i, item in enumerate(valueList, start=0):
    if i > 0:  
        print(secondList[i]) 

列举不是正确的选择,还有别的办法吗?


Tags: 代码in列表for错误计数器itemstart
2条回答

听起来好像你想把列表切片;仍然从一开始获取相同的索引:

for i, item in enumerate(valueList[1:], start=1):

然后从第二个元素开始循环valueList,并使用匹配索引:

>>> valueList = [1, 2, 3, 4]
>>> secondList = ['a', 'b', 'c', 'd']
>>> for i, item in enumerate(valueList[1:], start=1):
...     print(secondList[i])
... 
b
c
d

在这种情况下,我只使用zip()代替,可能与itertools.islice()结合使用:

from itertools import islice

for value, second in islice(zip(valueList, secondList), 1, None):
    print(value, second)

islice()调用为您跳过第一个元素:

>>> from itertools import islice
>>> for value, second in islice(zip(valueList, secondList), 1, None):
...     print(value, second)
... 
2 b
3 c
4 d

问题不是枚举,也不是start参数,而是这样一个事实:当您执行start=1操作时,您正在从1枚举到valueList+1

>>> valueList = [1, 2, 3, 4]
>>> secondList = ['a', 'b', 'c', 'd']
>>> for i, item in enumerate(valueList, start=1):
...     print(i)
...     print(secondList[i])
...     print('----')
... 
1
b
----
2
c
----
3
d
----
4
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
IndexError: list index out of range

当然,当您试图访问secondList[4]时,没有可用的值!您可能需要:

>>> for i, item in enumerate(valueList, start=1):
...     if i < len(secondList):
...         print(secondList[i])
... 
b
c
d

也就是说,我不确定你到底想达到什么目的。如果要跳过secondList的第一个值,那可能是一个解决方案,即使不是最有效的解决方案。更好的方法是实际使用slice操作符:

>>> print(secondList[1:])
['b', 'c', 'd']

如果要使用自然枚举(而不是计算机的枚举)遍历列表,即从1而不是0开始,那就不是要这样做了。要显示自然索引并使用计算机索引,只需执行以下操作:

>>> for i, item in enumerate(valueList):
...     print("{} {}".format(i+1, secondList[i]))
... 
1 a
2 b
3 c
4 d

最后,可以使用zip()而不是枚举来链接两个列表的内容:

>>> for i, item in zip(valueList, secondList):
...     print('{} {}'.format(i, item))
... 
1 a
2 b
3 c
4 d

它将显示与同一索引处的secondList值相连的valueList的每个值。

相关问题 更多 >