2015-02-13 2 views
0

У меня есть список, которые состоят из данных, какДобавление двух объектов дата время, когда линия соответствует из списка в Python

data1_part1 data1_part2 -> 1:02:04 
data2_part1 data2_part2 -> 0:01:01 
data3_part1 data3_part3 -> 1:01:02 
data2_part1 data2_part2 -> 1:02:01 

В этом случае я хочу выход в

data1_part1 data1_part2 -> 1:02:04 
data3_part1 data3_part3 -> 1:01:02 
data2_part1 data2_part2 -> 1:03:02 

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

код до сих пор:

value_len = len(value_list) 
searched_val = [] 

for x in range(0,value_len): 

    val = value_list[x].split(" -> ")[0] 
    time_1 = value_list[x].split(" -> ")[1] 

    time_val = datetime.strptime(time_1, "%H:%M:%S") 
    #time_val = time_val.time() 

    if str(val) in searched_val: 
     for z in range(0,len(searched_val)): 
      print ("search val: " + str(searched_val[z])) 
      time_old = str(searched_val[z].split(" -> ")[1]) 
      time_old = time_old.split()[1] 

      hr = int(time_old.split(":")[0]) 
      mins = int(time_old.split(":")[1]) 
      sec = int(time_old.split(":")[2]) 

      del_time = timedelta(hours=hr,minutes=mins,seconds=sec) 
      time = time_val + del_time 

      searched_val.append(str(val) + " -> " + str(time)) 
    else: 
     searched_val.append(str(val) + " -> " + str(time_val)) 
     #print (len(search_val)) 

for x in range(0, len(searched_val)): 
     print ("Added time: " + str(searched_val[x])) 

Но это не печатает ответ я ожидал, как я считаю, что исполнение не идет в

for z in range(0,len(searched_val)): 

Как я предполагаю, что строка значения в первой части (т.е.) до "->" не могут быть сопоставлены. Я даже не знаю, почему.

+0

как насчет печати как 'val', так и' search_val' и проверки, какие значения есть? – Ashalynd

+0

@Ashalynd Я пробовал проблему: 'if str (val) в search_val:' не удалось найти подстроку 'val' в' search_val'. Заключительный оператор печати печатает все, что было на входе, что означает, что оператор не попадал в 'for z in range (0, len (search_val)):' и время не складывается. – user3703782

+0

Имеет ли смысл порядок строк 'data_x part_y'? Если нет, вам будет намного легче использовать словари. –

ответ

0

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

>>> l = ['hello 11', 'world 22'] 
>>> 'hello' in l # substring in list? 
False 
>>> 'hello 11' in l # full element in list? 
True 

Ниже приведено решение, более питоническое. Он использует словари. Обратите внимание, что я использую defaultdict от collections module, что, по моему мнению, было более полезным здесь.

>>> from collections import defaultdict 
>>> from datetime import datetime 
>>> 
>>> # First, generate a list of strings, similar to yours 
... U = """data1_part1 data1_part2 -> 1:02:04 
... data2_part1 data2_part2 -> 0:01:01 
... data3_part1 data3_part3 -> 1:01:02 
... data2_part1 data2_part2 -> 1:02:01""".split('\n') 
>>> 
>>> unix_epoch = datetime(1900,1,1) 
>>> coll = defaultdict(lambda: unix_epoch) 
>>> for row in U: 
...  key, timing = row.split(' -> ') 
...  coll[key] += (datetime.strptime(timing, "%H:%M:%S") - unix_epoch) 
... 
>>> for k,v in coll.items(): 
...  print("{} -> {}".format(k, v.strftime("%H:%M:%S"))) 
... 
data2_part1 data2_part2 -> 01:03:02 
data1_part1 data1_part2 -> 01:02:04 
data3_part1 data3_part3 -> 01:01:02 

Важно понимать, что этот код (или, вернее, интерпретация его результатов) подлежит синхронизацию с переполнением: когда вы подытожить 2 часа до некоторого пункта, который уже имеет индикацию синхронизации из 23h, кода будет правильно переходить на следующий день, но будет показывать только 01 часов. По собственному опыту я могу только рекомендовать изменить временные метки на полные временные индикаторы (= дата + время) как можно раньше.