Эффективно сократить серию списков в одномерный список ненулевых значений в Python - PullRequest
0 голосов
/ 09 октября 2019

Есть ли лучший способ решения этой проблемы?

Задача : уменьшить ряд панд, статус , до списка l , приведенного ниже;

status = [[], [], [], [], ['200'], [], [], ['200']]
l = ['200', '200']

Вот как я это решил;

def flatten(x):
   if len(x)>0:
       return x[0]
   else: 
       return ""

status = status[status.apply(lambda x: flatten(x)) != ""]
l = [i for row in status.iloc[:] for i in row]

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Вы можете использовать пакет itertools для эффективного выравнивания списков.

import itertools
import pandas as pd

df = pd.DataFrame({
    "a": [[], [], [200], [], [200]]
})

list2d = df["a"].values
list(itertools.chain(*list2d))

Вывод:

[200, 200]

Время тестирования

Сначала давайте создадим фиктивный двумерный список:

list2d = [[_] for _ in range(100000000)]

Сглаживание Itertools:

%%timeit
[*itertools.chain(*list2d)]

5,55 с ± 151 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

Сглаживание списка:

%%timeit​
[e for i in list2d for e in i]

6,34 с ± 228 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

0 голосов
/ 09 октября 2019

Это называется списком списков:

l =[e for i in status for e in i]
0 голосов
/ 09 октября 2019
status = [[], [], [], [], ['200'], [], [], ['200']]
l = [i for sublist in status for i in sublist]

выход

['200', '200']
...