2016-02-14 3 views
0

Я работаю над своим кодом, поскольку я хочу сравнить int в строках в инструкции if, чтобы узнать, равно ли оно или больше.сравнить int в строках

Когда я пытаюсь это:

for prog_clock, prog_length, pos_X, prog_ids in izip_longest(program_clock, programs_length, posX, progId, fillvalue=''): 
    epg_time_1 = self.getControl(344).getLabel() 
    epg_time_2 = self.getControl(345).getLabel() 
    epg_time_3 = self.getControl(346).getLabel() 


    if int(pos_X) == 375: 
     for program_id, program_length, program_minutes in zip(prog_id_list, programs_length, program_remaining): 

      if epg_time_2 == prog_clock: 
       print "WORKING 1" 

      elif prog_clock > epg_time_1 and epg_time_2 > prog_clock: 
       print "WORKING 2" 


      elif epg_time_3 == prog_clock: 
       print "WORKING 3" 


      elif epg_time_3 < prog_clock: 
       print "WORKING 4" 

Выход для prog_clock:

21:41:45 T:5796 NOTICE: 11:00PM 
21:41:45 T:5796 NOTICE: 10:00PM 
21:41:45 T:5796 NOTICE: 10:00PM 
21:41:45 T:5796 NOTICE: 10:45PM 
21:41:45 T:5796 NOTICE: 11:05PM 
21:41:45 T:5796 NOTICE: 10:00PM 
21:41:45 T:5796 NOTICE: 10:00PM 

Выход для epg_time_1:

9:30PM 

Выход для epg_time_2:

10:00PM 

Выход для epg_time_3:

10:30PM 

Я хочу сравнить три строки из объекта строки с каждым из prog_clock строки, чтобы увидеть, если заявление, которое я могу получить пройти для каждого из них строк для программы телевидения. Когда я пытаюсь их сравнить, это не позволит мне перейти к любому из этих операторов if. Итак, как я могу сравнить int в строках, чтобы убедиться, что значение равно или больше?

+1

Поскольку вы работаете со временными метками здесь, не лучше ли разобрать эту часть исключительно по времени, а затем (используя функциональность Python, такую ​​как 'datetime.strptime') сравнить марки? – rbaleksandar

+0

Да, конечно, я работаю над этим, так что было бы лучше, если бы я использовал 'datetime.strptime' или что? –

+0

Ну, когда у вас есть инструменты, я не понимаю, почему не использовать их. : P Так как каждая строка состоит из двух временных меток в очень определенном месте (а именно 1), начиная с первого места, а затем 2) последнего места до конца строки), вы можете легко получить эти куски и выполнить манеру разбора и делать все, что хотите с ними. – rbaleksandar

ответ

-2

Если строки идентичны, сравнивая их непосредственно должны работать

string1 = '10:00PM' 
string2 = '11:00PM' 

print(string2 > string1) 

print(string1 > string2) 

выходы

True 
False 

EDIT: После прочтения комментариев, я решил изменить свой ответ и опубликовать решение с time.strptime

from time import strptime 

format = '%I:%M%p' # format to striptime 

epg_time_1 = strptime('9:30PM', format) 
epg_time_2 = strptime('10:10PM', format) 
epg_time_3 = strptime('10:30PM', format) 


prog_clock = strptime('10:00PM', format) 

if epg_time_2 == prog_clock: 
    print("WORKING 1") 

elif prog_clock > epg_time_1 and epg_time_2 > prog_clock: 
    print("WORKING 2") 


elif epg_time_3 == prog_clock: 
    print("WORKING 3") 


elif epg_time_3 < prog_clock: 
    print("WORKING 4") 

Выходы "WORKING 2"

+0

что делать, если они равны или больше? –

+0

Причина, по которой он не работает, заключается в том, что строки сравниваются с лексикографией, т.е. сравнивает первый элемент, поэтому «10:00 PM» будет меньше, чем «9:30 вечера», т.е. 1 меньше 9. Это можно было бы исправить, просто сделав это '09:30 PM' ... но я думаю, вы не хотите этого – danidee

+0

Я отредактировал свой ответ, используя' strptime' .... он должен работать для вас сейчас – danidee

0

Хорошо, поэтому для каждой линии вы можете применить функцию parseLine(str) снизу. Что я делаю в основном следующие:

Для данной линии (например: 21:41:45 T:5796 NOTICE: 10:00PM) Я

  1. Получить первую метку времени, которую мы знаем, что имеет формат HH:MM:SS
  2. Получить вторая метка время, который мы знаем, что имеет формат HH:MM(AM/PM)
  3. Преобразовать как для временных объектов (см here)
  4. Сравнить

Конечно, вы можете отрегулировать формат в соответствии с форматом строки (в случае, если вы решили ее изменить). Важно преобразовать временные метки правильно, так как первый использует 24-часовой формат, а второй - 12-часовой формат (я использую %I, чтобы преобразовать часовую часть второй временной метки в 24-часовой формат, чтобы мы могли легко сравнить оба). Само сравнение выполняется с помощью Python и объектов времени, которые его поддерживают. Также я предположил, что обе ваши временные метки используют пространство в качестве разделителя из средней подстроки, но в случае, если первая разделена табулятором, вы можете изменить опцию разделителя split() от ' ' до '\t'.

from datetime import datetime 

def parseLine(line): 
    # Use split() and rsplit() to get the stamps 
    # Extract the first timestamp - it is separated from the rest by the first space in your string 
    first_tstamp = line.split(' ', 1)[0] 
    # Extract the second timestamp - it is separated from the rest by the last space in your string 
    last_tstamp = line.rsplit(' ', 1)[1] 

    # Parse the string representations of both stamps to a time object 
    t_first = datetime.strptime(first_tstamp, "%H:%M:%S").time() # Format: HH:MM:SS 
    t_second = datetime.strptime(last_tstamp, "%I:%M%p").time() # Format: HH:MM(PM/AM) 

    print("FIRST",t_first) 
    print("SECOND",t_second) 

    if(t_first > t_second): return 1 
    elif(t_first < t_second): return -1 
    else: return 0 

def test(line): 
    res = parseLine(line) 

    if(res > 0): print("FIRST later than LAST") 
    elif(res < 0): print("FIRST earlier than LAST") 
    else: print("FIRST same as LAST") 

print("--------Test 1--------") 
# First is earlier than second 
test("21:41:45 T:5796 NOTICE: 11:00PM") 
print("--------Test 2--------") 
# First is later than second 
test("12:05:30 T:5796 NOTICE: 10:00AM") 
print("--------Test 3--------") 
# First is same as second 
test("23:00:00 T:5796 NOTICE: 11:00PM") 

Есть на самом деле несколько решений для этого, и это может быть не самое лучшее, но это делает трюк. Выход теста я делаю в конце концов:

FIRST earlier than LAST # Because 21 is less than 11PM (=23) 
FIRST later than LAST # Because 12 is greater than 10AM (=10) 
FIRST same as LAST  # Because 23 is the same as 11PM (=23) 
+0

Ах, разбор не требуется. Ничего. Вы уже приняли ответ. – rbaleksandar

0

prog_clock Для экстракта компонента времени из строки, разобрать его, используя datetime.strptime() и преобразовать его в datetime.time объекта. Теперь вы можете сравнить время напрямую. Просто добавьте четыре строки для разбора ввода, как показано ниже:

from datetime import datetime 

for prog_clock, prog_length, pos_X, prog_ids in izip_longest(program_clock, programs_length, posX, progId, fillvalue=''): 
    epg_time_1 = self.getControl(344).getLabel() 
    epg_time_2 = self.getControl(345).getLabel() 
    epg_time_3 = self.getControl(346).getLabel() 

    # parse time data into datetime.time objects for comparison 
    prog_clock = datetime.strptime(prog_clock.split()[-1], '%I:%M%p').time() 
    epg_time_1 = datetime.strptime(epg_time_1, '%I:%M%p').time() 
    epg_time_2 = datetime.strptime(epg_time_2, '%I:%M%p').time() 
    epg_time_2 = datetime.strptime(epg_time_3, '%I:%M%p').time() 

    ... 

На самом деле, преобразование в datetime.time объектов не является обязательным - если опустить его все datetime.datetime значения будет иметь ту же дату (1900-01-01) и сравнение времени все равно будет работать.

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