2015-10-11 3 views
0

Я пытаюсь создать программу, которая берет строку, которая представляет дату, из списка и сравнивает ее с двумя другими датами. Если между этими двумя датами, программа заменяет строку в списке на день, месяц и год.Ошибка значения преобразования строки в int в Python

Проблема заключается в том, что если преобразовать эту строку в «междунар», в консоли, это нормально, но когда я запускаю программу у меня есть следующее сообщение об ошибке:

ValueError: invalid literal for int() with base 10: '' 

То есть мой код:

def date(lst, d1, d2): 
for d in lst: 
    if int(d[4:])>=int(d1[4:]) or int(d[4:])<=int(d2[4:]): 
     if int(d[2:4])>=int(d1[2:4]) or int(d[2:4])<=int(d2[2:4]): 
      if int(d[0:2])>=int(d1[0:2]) or int(d[0:2])<=int(d2[0:2]): 
       j=d 
       j1=j[0:2] 
       j2=j[2:4] 
       j3=j[4:] 
       lst.insert(lst.index(d),j3) 
       lst.insert(lst.index(d),j2) 
       lst.insert(lst.index(d),j1) 
       lst.remove(d) 
return lst 

Так,

print date(['24012014', '22032015', '03022015', '15122014', '11112015'], '22022014', '10112015') 

должен вернуть ['24012014', 22, 3, 2015, 3, 2, 2015, 15, 12, 2014, '11112015']

+3

Yikes - не изменяйте список, пока вы пытаетесь пройти через него. Создайте новый список и верните его. – doctorlove

+0

Я бы хотел, но это для школы, и я должен использовать тот же список .... – PadreMaronno

+0

, если даты были в обратном порядке, например. '20141225', вы можете сравнить их, не преобразовывая их в' int' – Pynchia

ответ

0

Комментарий эти две строки, и он будет работать:

lst.insert(lst.index(d), j2) 

lst.insert(lst.index(d), j1) 

По-видимому, когда цикл по списку и в то же время удалить и вставить в начальной индексации становится неправильным.

Чтобы избежать неприятностей, работа с копией списка:

def date(lst, d1, d2): 
    lstC = list(lst) 
    for d,dd in zip(lst, lstC): 
     if int(d[4:]) >= int(d1[4:]) or int(d[4:]) <= int(d2[4:]): 
      if int(d[2:4]) >= int(d1[2:4]) or int(d[2:4]) <= int(d2[2:4]): 
       if int(d[0:2]) >= int(d1[0:2]) or int(d[0:2]) <= int(d2[0:2]): 
        j = d 
        j1 = j[0:2] 
        j2 = j[2:4] 
        j3 = j[4:] 
        ind_d = lst.index(d) 
        lstC.insert(ind_d, j3) 
        lstC.insert(ind_d, j2) 
        lstC.insert(ind_d, j1) 
        lstC.remove(dd) 

    return lstC 

print(date(['24012014', '22032015', '03022015', '15122014', '11112015'], '22022014', '10112015')) 

['24', '22', '02', '2015', '03', '2015', '2014', '22032015', '03022015', '15122014', '11112015'] 

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

def date(lst, d1, d2): 
    # from copy import deepcopy 
    for i in range(len(lst) - 1, -1, -1): 
     if int(lst[i][4:])>=int(d1[4:]) or int(lst[i][4:])<=int(d2[4:]): 
      if int(lst[i][2:4])>=int(d1[2:4]) or int(lst[i][2:4])<=int(d2[2:4]): 
       if int(lst[i][0:2])>=int(d1[0:2]) or int(lst[i][0:2])<=int(d2[0:2]): 
        j=lst[i] 
        j1=j[0:2] 
        j2=j[2:4] 
        j3=j[4:] 
        ind_d = lst.index(lst[i]) 
        lst.insert(ind_d,j3) 
        lst.insert(ind_d,j2) 
        lst.insert(ind_d,j1) 
        lst.remove(lst[i]) 

    return lst 

print(date(['24012014', '22032015', '03022015', '15122014', '11112015'], '22022014', '10112015')) 

['01', '2014', '24012014', '03', '2015', '22032015', '02', '2015', '03022015', '15122014', '11112015'] 
+0

Что это за линия для: d, dd в zip (lst, lstC) :? – PadreMaronno

+0

он объединяет эти два списка, так что возможна итерация в одно и то же время. Это стандартная и очень полезная операция в Python. – LetzerWille

Смежные вопросы