Скрытый комплексный список в плоский список - PullRequest
2 голосов
/ 26 сентября 2019

У меня длинный список, состоящий из массивов и целых чисел, ниже приведен пример:

[array([[2218.67288865]]), array([[1736.90215229]]), array([[1255.13141592]]), array([[773.36067956]]), array([[291.58994319]]), 0, 0, 0, 0, 0, 0, 0, 0, 0]

, и я хотел бы преобразовать его в обычный список следующим образом:

[2218.67288865, 1736.90215229, 1255.13141592, 773.36067956, 291.58994319, 0, 0, 0, 0, 0, 0, 0, 0, 0]

Как я могу сделать это эффективно?

Ответы [ 4 ]

0 голосов
/ 27 сентября 2019

Вы можете придерживаться numpy, используя np.ravel:

np.hstack([np.ravel(i) for i in l]).tolist()

Выход:

[2218.67288865,
 1736.90215229,
 1255.13141592,
 773.36067956,
 291.58994319,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0]
0 голосов
/ 26 сентября 2019

list(itertools.from_iterable(itertools.from_iterable(...))) должно работать для удаления 2 уровней вложенности: просто добавьте или удалите копии itertools.from_iterable(...) по мере необходимости.

0 голосов
/ 26 сентября 2019

Здесь самый простой, кажется, самый быстрый:

x = [array([[2218.67288865]]), array([[1736.90215229]]), array([[1255.13141592]]), array([[773.36067956]]), array([[291.58994319]]), 0, 0, 0, 0, 0, 0, 0, 0, 0]
[y if y.__class__==int else y.item(0) for y in x]
# [2218.67288865, 1736.90215229, 1255.13141592, 773.36067956, 291.58994319, 0, 0, 0, 0, 0, 0, 0, 0, 0]

timeit(lambda:[y if y.__class__==int else y.item(0) for y in x])
# 2.198630048893392
0 голосов
/ 26 сентября 2019

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

def convert(obj):
    try:
        for item in obj:
            yield from convert(item)
    except TypeError:
        yield obj

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