2014-11-29 5 views
1

Я пытаюсь напечатать ближайшее значение списка, дающего пользователю ввод. На практике пользователь дает мне время, и я хочу проверить, включено ли это значение в список расписания, иначе я хочу увеличить минуты до тех пор, пока не выберу значение списка, а затем распечатаю время в слоте тридцать минут. Вот мой код. Можете ли вы помочь мне показать, что не работает? СпасибоРаспечатайте определенное время, заданное пользователем python

def print_specific_time(): 
f = open("Bus 6 Lugano Stazione.txt") 
lines = f.readlines() 
d = defaultdict(list) 
start = lines.index("Monday\n") 
stop = lines.index("Saturday\n") 
time = "07.35" 
hour = time[0] + time[1] 
minutes = time[3:] 
for line in lines[start:stop]: 
    line = line.strip(",") 
    line = line.replace("\n","") 
    line = line.replace(" ","") 
    line = line.split("|") 
    key = line[0] 
    if len(line) == 2: 
     d[key] += [line[1]] 
    if minutes not in d[hour]: 
     minutes = int(minutes) + 1 
     minutes = str(minutes) 
     print(minutes) 
     if minutes in d[hour]: 
      print(minutes) 
      print(hour,d[hour]) 
       else: 
      if minutes == '59': 
       hour = int(hour) 
       hour = hour + 1 
       hour = "0" + str(hour) 
       minutes = "00" 
d = dict(d) 
for key in d.keys(): 
    if key == hour: 
     print(key,d[key]) 

В файле у меня есть список расписаний, которые помещаются внутри словаря. Вот выход, над которым я работаю:

{'06': ['11', '26', '41', '56'], '12': ['06', '36'], '11': ['06', '36'], 
'07': ['11', '26', '41', '56'], '16': ['11', '26', '41', '56'], '14': ['06', '36'], 
'17': ['11', '26', '41', '56'], '20': ['05', '35'], '15': ['06', '36', '56'], 
'09': ['06', '36'], '21': ['05', '35'], '22': ['05', '35'], '23': ['05', '35'], 
'19': ['11', '40'], '08': ['11', '26', '41'], '13': ['06', '36'], '10': ['06', '36'], 
'18': ['11', '26', '41', '56']} 

Я объясняю это лучше. Если, например, пользователь поставил время, подобное 07.35, моя программа должна печатать 07.41, 07.56 и ничего больше (потому что нет времени после 7.56 в слоте 30 минут). Можете ли вы помочь мне проверить, что случилось? Thanks

EDIT Ok. Теперь я могу распечатать временные интервалы времени 07 часов (это частично верно), но я не понимаю, почему python печатает его только тогда, когда переменная минут равна «56», а не «41», что находится в списке ....

ответ

1

Я думаю, что вы немного скомпрометируете его. Это одно за другим не обязательно. Вот мой код, чтобы найти ближайшее время в словаре:

def find(time): 
    start_hour, start_minute = map(int, time.split('.')) 
    for h in range(start_hour, 24): 
     hour = "{0:02d}".format(h) 
     if hour in data.keys(): 
      line = data[hour] 
      if h == start_hour: 
       line = list(filter(lambda m: int(m) >= start_minute, line)) 
      if len(line) > 0: 
       return '%s.%s' % (hour, line[0]) 

Здесь вы можете увидеть его работу: fiddle.

Редактировать: Я изменил код на python3. (И скрипка тоже.)

Edit2: Я также сделал версию, которая перечисляет каждый раз в следующие полчаса. Fiddle.

+0

Извините .... Что такое «xrange»? – pp94

+0

Я пробовал его в python, но, конечно, говорит, что диапазон не задан – pp94

+0

Извините, я написал его в python2. Это просто 'range' в python3. – zord

0

Вот полное издание с кодом, разделяющим две функции. Код был сделан благодаря помощи @zord:

def printed(): 
f = open("Bus 6 Lugano Stazione.txt") 
lines = f.readlines() 
d = defaultdict(list) 
start = lines.index("Monday\n") 
stop = lines.index("Saturday\n") 
time = "07.35" 
hour = time[0] + time[1] 
minutes = time[3:] 
for line in lines[start:stop]: 
    line = line.strip(",") 
    line = line.replace("\n","") 
    line = line.replace(" ","") 
    line = line.split("|") 
    key = line[0] 
    if len(line) == 2: 
     d[key] += [line[1]] 
d = dict(d) 
return d 

def find(time): 
    data = printed() 
    data2 = [int(h) * 60 + int(m) for h in data.keys() for m in data[h]] 
    start_hour, start_minute = map(int, time.split('.')) 
    start = start_hour * 60 + start_minute 
    end = start + 30 
    after = list(filter(lambda x: start <= x <= end, data2)) 
    return list(map(lambda x: '%02d.%02d' % (x // 60, x % 60), after)) 
+0

Я добавил вторую скрипку к моему ответу. Это может помочь вам дальше. – zord

+0

дайте мне минуту, чтобы слиться и попробовать – pp94

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