Обновлено ... Снова
Я неправильно понял вопрос. Если вы используете большие списки, тогда списочные списки - путь, и они довольно просты, как только вы научитесь их использовать.
Я собираюсь использовать два списка понимания.
idxs = [i for i, val in enumerate(l2) if val in l1] + [len(l2)+1]
res = {l2[idxs[i]]: list(l2[idxs[i]+1: idxs[i+1]]) for i in range(len(idxs)-1)}
print(res)
Результаты:
{'a': ['el1', 'el2', 'el3', 'el4'],
'b': ['some_other_el_1', 'some_other_el_2'],
'c': ['another_element_1', 'another_element_2'],
'd': ['', '', 'another_element_3', 'd4']}
Тестирование скорости для больших списков:
import collections
l1 = ['a', 'c', 'b', 'e', 'f', 'd']
l2 = [
'x','q','we','da','po',
'a', 'el1', 'el2', 'el3', 'el4', *(str(i) for i in range(300)),
'b', 'some_other_el_1', 'some_other_el_2', *(str(i) for i in range(100)),
'c', 'another_element_1', 'another_element_2', *(str(i) for i in range(200)),
'd', '', '', 'another_element_3', 'd4'
]
def run_comp():
idxs = [i for i, val in enumerate(l2) if val in l1] + [len(l2)+1]
res = {l2[idxs[i]]: list(l2[idxs[i]+1: idxs[i+1]]) for i in range(len(idxs)-1)}
def run_other():
d = collections.defaultdict(list)
k = ''
for x in l2:
if x in l1:
k = x
else:
d[k].append(x)
import timeit
print('For Loop:', timeit.timeit(run_other, number=1000))
print("List Comprehension:", timeit.timeit(run_comp, number=1000))
Результаты:
For Loop: 0.1327093063242541
List Comprehension: 0.09343156142774986
старые вещи ниже
Это довольно просто для списочных представлений.
{key: [val for val in l2 if key in val] for key in l1}
Результаты:
{'a': ['a', 'a1', 'a2', 'a3', 'a4'],
'b': ['b', 'b1', 'b2', 'b3', 'b4'],
'c': ['c', 'c1', 'c2', 'c3', 'c4'],
'd': ['d', 'd1', 'd2', 'd3', 'd4'],
'e': [],
'f': []}
Код ниже показывает, что происходит выше.
d = {}
for key in l1:
d[key] = []
for val in l2:
if key in val:
d[key].append(val)
Понимание списка / словарное понимание (первая часть кода) на самом деле намного быстрее. Понимание списка создает список на месте, что намного быстрее, чем проходить и добавлять в список. При добавлении программа просматривает список, выделяет больше памяти и добавляет данные в список, что может быть очень медленным для больших списков.
Ссылки: