Не уверен, что здесь об этом спрашивали.
У меня есть четыре списка (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))
Есть ли у кого-нибудь идеи, как улучшить этот код? Мне нужно что-нибудь поскорее. Также обратите внимание, что я делаю это для все более и менее упорядоченных списков отдельно, что добавляет больше времени. (поделился кодом только для возрастающего регистра)
Большое спасибо за вашу помощь!