Эффективно объединить список в разреженный список - PullRequest
0 голосов
/ 13 июня 2018

У меня есть два списка:

a = [None, None, 1, None, 4, None, None, 5, None]
b = [7,8,2,3,6,9]

Я хочу объединить их, либо создать новый список, либо просто обновить a, заполнив Nones значениями из b, поэтому

a = [7,8,1,2,4,3,6,5,9]

Какой самый эффективный способ сделать это?

Для расширения я буду хотеть делать это с каждой перестановкой b.Это позволяет вообще сокращать технику?

Ответы [ 5 ]

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

Для работы с большими списками вы можете найти сторонние библиотеки более эффективными, например, через Pandas или NumPy.

pandas

Создать 2 серии и использовать присваивание с логическим индексированием:

import pandas as pd

a = pd.Series([None, None, 1, None, 4, None, None, 5, None])
b = pd.Series([7,8,2,3,6,9])

a[a.isnull()] = b.values

print(a.values.astype(int).tolist())

# [7, 8, 1, 2, 4, 3, 6, 5, 9]

numpy

Аналогично NumPy, если вы используете np.nan вместо None:

import numpy as np

a = np.array([np.nan, np.nan, 1, np.nan, 4, np.nan, np.nan, 5, np.nan])
b = np.array([7,8,2,3,6,9])

a[np.isnan(a)] = b

# array([ 7.,  8.,  1.,  2.,  4.,  3.,  6.,  5.,  9.])

См. Также В чем преимущества NumPy по сравнению собычные списки Python? .

0 голосов
/ 13 июня 2018

Рекурсивное приложение:

a = [None, None, 1, None, 4, None, None, 5, None]
b = [7,8,2,3,6,9]

def recursion_approach(first_list,second_list):

    for index,value in enumerate(first_list):
            if value!=None:
                first_list[index]=value
            else:
                first_list[index]=second_list[0]
                recursion_approach(first_list,second_list[1:])

    return first_list

print(recursion_approach(a,b))

Выход:

[7, 8, 1, 2, 4, 3, 6, 5, 9]
0 голосов
/ 13 июня 2018
for reversed_index in range(len(a) - 1, -1, -1):
    if a[reversed_index] is None:
        a[reversed_index] = b.pop()

Он должен быть эффективным, так как он изменяет a на месте, и правый всплывающий список также эффективен.Насколько я думаю, это O(len(a)) решение.

0 голосов
/ 13 июня 2018

С методом list.pop() в обратном порядке 2-й b список:

a = [None, None, 1, None, 4, None, None, 5, None]
b = [7,8,2,3,6,9]
tmp = b[::-1]

result = [tmp.pop() if i is None else i for i in a]
print(result)    # [7, 8, 1, 2, 4, 3, 6, 5, 9]
0 голосов
/ 13 июня 2018

Это один из подходов.Использование понимания списка и преобразование b в объект итератора.

Демонстрация:

a = [None, None, 1, None, 4, None, None, 5, None]
b = [7,8,2,3,6,9]
b = iter(b)

print( [next(b) if i is None else i for i in a] )

Вывод:

[7, 8, 1, 2, 4, 3, 6, 5, 9]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...