Python: объединить 3 списка и просуммировать соответствующие четвертые элементы списка. - PullRequest
1 голос
/ 17 июня 2020

Не уверен, что здесь об этом спрашивали.

У меня есть четыре списка (3 упорядоченных и четвертый не обязательно) одинаковой длины, и я хочу объединить 3 первых списка, а затем суммировать соответствующие элементы в четвертый список.

В качестве примера:

L1= [1,1,2,3,4]
L2= [2,2,2,5,6]
L3= [3,3,3,7,8]
L4= [10,20,30,40,50]

Ожидаемый результат:

L1= [1,2,3,4,0]
L2= [2,2,5,6,0]
L3= [3,3,7,8,0]
L4= [30,30,40,50,0]

Что он делает, так это то, что он смотрит на первые 3 списка и проверяет, являются ли элементы избыточными (в этом примере, поскольку 1 избыточен, он будет проверять только в L2 и L3, есть ли повторяющийся элемент (не обязательно 1), поэтому на выходе L2 и L3 все еще есть 2 и 3 соответственно в первых двух позициях). Затем он объединяет эти избыточные элементы, как в выходных данных, суммируя соответствующие элементы в списке L4.

Предположим, у вас есть 4 списка, вы посмотрите на первые 3 списка. Когда избыточность возникает в одном из этих 3 списков (в примере 1 встречается два раза), вы проверяете в двух других списках, повторяются ли какие-либо из их элементов в одно и то же время, начиная с той же позиции, что и в первом списке. . В этом примере 1 находится в позиции 0 L1 и повторяется в позиции 1 (1 повторяется два раза), теперь вы проверяете в L2 и L3, идентичны ли их элементы в позициях 0 и 1 (2 повторяется 3 раза в L2 -> агрегировать только первые два)

Элементы должны повторяться, начиная с одной и той же позиции (списки имеют одинаковую длину) и повторяться одинаковое количество раз. Вот почему в L2 и L3 первые два избыточных элемента объединены, оставляя только две двойки и две тройки в L2 и L3 соответственно. Что касается L4, мы суммировали первые два элемента, потому что именно там возникли предыдущие условия. Поскольку мы объединили две избыточности в каждом из 3 списков (первые единицы в L1, первые 2 в L2 и первые 3 в L3), мы хотели бы заполнить остальные списки нулем в конце, чтобы сохранить ту же длину, что и исходные списки (здесь len = 5).

Мне удалось решить эту проблему с помощью dataframes и groupby / agg, но мне нужно что-то более быстрое, поскольку я использую его в режиме реального времени для некоторых датчиков захвата высокочастотных данных.

Код:

import pandas as pd
from itertools import repeat

def main():

    L1= [1,1,2,3,4]
    L2= [2,2,2,5,6]
    L3= [3,3,3,7,8]
    L4= [10,20,30,40,50]
    df = pd.DataFrame(data={'L1':L1, 'L2':L2, 'L3':L3, 'L4':L4}
    df = df.groupby(['L1','L2','L3'], as_index=False, sort=False).agg({'L4':sum})

    L1new =df['L1'].tolist()
    L2new =df['L2'].tolist()
    L3new =df['L3'].tolist()
    L4new =df['L4'].tolist()

    # keep initial length
    L1new.extend(repeat(0.0,len(L1)-len(L1new))
    L2new.extend(repeat(0.0,len(L2)-len(L2new))
    L3new.extend(repeat(0.0,len(L3)-len(L3new))
    L4new.extend(repeat(0.0,len(L4)-len(L4new))

Есть ли у кого-нибудь идеи, как улучшить этот код? Мне нужно что-нибудь поскорее. Также обратите внимание, что я делаю это для все более и менее упорядоченных списков отдельно, что добавляет больше времени. (поделился кодом только для возрастающего регистра)

Большое спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...