как суммировать смежные кортежи / список

#python

#python

Вопрос:

Я приношу извинения за ужасное описание, и если это дублированное, я понятия не имею, как сформулировать этот вопрос. Позвольте мне объяснить, что я пытаюсь сделать. У меня есть список, состоящий из 0 и 1, длиной 3600 элементов (данные временного ряда за 1 час). я использовал itertools.groupby() для получения списка последовательных ключей. Мне нужно, чтобы (0,1) считалось как (1,1) и суммировалось с соседними кортежами.

итак

 [(1,8),(0,9),(1,5),(0,1),(1,3),(0,3)]
  

становится

 [(1,8),(0,9),(1,5),(1,1),(1,3),(0,3)]
  

который должен стать

 [(1,8),(0,9),(1,9),(0,3)]
  

прямо сейчас у меня есть

 def counter(file):
    list1 = list(dict[file]) #make a list of the data currently working on
    graph = dict.fromkeys(list(range(0,3601))) #make a graphing dict, x = key, y = value

    for i in list(range(0,3601)):
        graph[i] = 0 # set all the values/ y from none to 0

    for i in list1:
        graph[i]  =1 #populate the values in graphing dict

    x,y = zip(*graph.items()) # unpack graphing dict into list, x = 0 to 3600 and y = time where it bite

    z = [(x[0], len(list(x[1]))) for x in itertools.groupby(y)] #make a new list z where consecutive y is in format (value, count)

    z[:] = [list(i) for i in z]

    for i in z[:]:
        if i == [0,1]:
            i[0]=1 
   return(z)
  

dict это словарь, где ключами являются имена файлов, а значениями — список чисел, которые будут использоваться в функции counter() . и это дает мне что-то вроде этого, но намного дольше

 [[1,8],[0,9],[1,5], [1,1], [1,3],[0,3]]
  

правки:
решил это с помощью друга,

 while (0,1) in z:
    idx=z.index((0,1))
    if idx == len(z)-1:
        break
    z[idx] = (1,1 z[idx-1][1]   z[idx 1][1])
    del z[idx 1]
    del z[idx-1]
  

Комментарии:

1. добавил решение мой друг

Ответ №1:

Не уверен, что именно вам нужно. Но это моя лучшая попытка понять это.

 def do_stuff(original_input): 
    new_original = []

    new_original.append(original_input[0])

    for el in original_input[1:]:
        if el == (0, 1):
            el = (1, 1)
        if el[0] != new_original[-1][0]:
            new_original.append(el)
        else:
            (a, b) = new_original[-1]
            new_original[-1] = (a, b   el[1])
    return new_original
# check
print (do_stuff([(1,8),(0,9),(1,5),(0,1),(1,3),(0,3)]))
  

Комментарии:

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