如何在for循环python中使用counter

时间:2009-05-20 07:36:05

标签: python iterator

my_date_list = ['01', '02', '03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
str_date_list=[]
for item in my_date_list:
    str_date_list.append(item+'-'+'05' + '-' +'09')

counter= 0
i = iter(range(31))
for item in i:
    daily_user_status_list=[]
    print counter
    val_time1 = str_date_list[counter]
    val_time2 = str_date_list[counter + 1]
    counter =counter + 1

我在执行counter = counter + 1时收到代码错误。 基本上,我每次需要与str_date_list不同的时间。 但是counter = counter +1给了我代码错误。

还有其他办法吗?

7 个答案:

答案 0 :(得分:8)

计数器与您迭代的序列不一致。但更重要的是,柜台完全没必要。

你有几个手动迭代的东西可以自动化,它们会让你绊倒。特别是,你几乎不需要在迭代时手动跟踪计数器; Python的序列类型知道如何迭代自己。

这是我重写上述代码的意图(在交互式解释器中显示它的工作原理):

>>> dates = ["%(day)02d-05-09" % vars() for day in range(1, 31+1)]
>>> date_ranges = zip(dates[:-1], dates[1:])
>>> for (date_begin, date_end) in date_ranges:
...     print (date_begin, date_end)
... 
('01-05-09', '02-05-09')
('02-05-09', '03-05-09')
('03-05-09', '04-05-09')
…
('28-05-09', '29-05-09')
('29-05-09', '30-05-09')
('30-05-09', '31-05-09')

答案 1 :(得分:4)

只是为了踢,这是超级紧凑的Pythonic写这个方法:

from itertools import izip, islice
str_date_list = ['%02d-05-09' % i for i in xrange(1, 32)]
for val_time1, val_time2 in izip(islice(str_date_list, 0, None), islice(str_date_list, 1, None)):
    daily_user_status_list = [ <whatever goes here> ]
    # more code...

答案 2 :(得分:2)

您看到的错误是因为您在str_date_list列表上的索引超出范围,而不是因为您正在递增变量。

将循环打印的counter的最大值(30)与列表的长度(len(str_date_list))进行比较。由于索引从0开始,因此是长度为n is n - 1的列表中的最大索引。

答案 3 :(得分:2)

您不需要复制循环迭代变量和计数器:

my_date_list = ['01', '02', '03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31']
str_date_list=[]
for item in my_date_list:
    str_date_list.append(item+'-'+'05' + '-' +'09')

for i in xrange(len(my_date_list)-1):
    daily_user_status_list=[]
    print i
    val_time1 = str_date_list[i]
    val_time2 = str_date_list[i + 1]

答案 4 :(得分:2)

  1. 你不需要创建一个通过0-31的迭代器 你可以使用枚举,例如

    for i,sdate in enumerate(str_date_list):      打印i,sdate

  2. 如果您使用iter不是项目和计数器相同吗?

答案 5 :(得分:1)

计数器+ = 1

但这不是问题。错误是什么?缩进错误可能?

答案 6 :(得分:0)

写得更好:

str_date_list=[]
for n in xrange(1,32):
    str_date_list.append(str(n).zfill(2)+'-'+'05' + '-' +'09')

for i in xrange(len(str_date_list)):
    daily_user_status_list=[]
    print i
    val_time1 = str_date_list[i]
    val_time2 = str_date_list[i + 1]
  • xrange给出了一个(非常好的)迭代器,而不是给定边界的自然数。
  • 我们使用zfill来确保有一个前导零,而不是明确地写出它们
  • 避免迭代数组边界很重要!