Как использовать счетчик для цикла Python - PullRequest
1 голос
/ 20 мая 2009
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 ]

8 голосов
/ 20 мая 2009

Счетчик сбивается с последовательностей, по которым вы перебираете. Но более того, счетчик совершенно не нужен.

У вас есть несколько ручных итераций вещей, которые можно автоматизировать, и они заставляют вас споткнуться. Особенно вам вряд ли когда-нибудь понадобится вручную отслеживать счетчик во время итерации; Типы последовательностей 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')
4 голосов
/ 20 мая 2009

Только для пинка, вот суперкомпактный 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 голосов
/ 20 мая 2009
  1. вам не нужно создавать итератор для перехода к 0-31 Вы можете использовать перечисление, например.

    для i, sdate в перечислении (str_date_list): распечатать я, сдать

  2. если вы используете iter, не является ли предмет и счетчик одинаковыми?

2 голосов
/ 20 мая 2009

Вам не нужно дублировать переменную итерации цикла и счетчик:

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]
2 голосов
/ 20 мая 2009

Ошибка, которую вы видите, связана с тем, что вы индексируете вне диапазона в списке str_date_list, а не потому, что вы увеличиваете переменную.

Сравните наибольшее значение counter, которое печатает цикл (30), с длиной списка (len(str_date_list)). Поскольку индексирование начинается с 0, самый большой индекс в списке имеет длину n is n - 1.

1 голос
/ 20 мая 2009

счетчик + = 1

но это не проблема. В чем ошибка? Ошибка отступа может быть?

0 голосов
/ 20 мая 2009

лучше написано:

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, чтобы убедиться, что есть начальный ноль, вместо того, чтобы записывать их все явно
  • важно избегать итераций за пределами массива!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...