Учитывая такую проблему, что является наиболее эффективным (или достаточно эффективным) способом сделать это в Python:раскалывается Списки Списки по длине в Python
проблемы. Учитывая список списков,
L = [list_0, list_1, list_2, list_3, ..., list_n]
где LEN (list_i) < = 3, скажем, для каждого списка внутри L. Как мы можем разделить L в L_1, L_2, L_3, где L_1 имеет только длина 1, L_2 имеет только 2 списка, а L_3 имеет только 3 списка?
Потенциальные решения. Вот лучшее, что я мог сделать; Я также включил образец здесь. Он работает примерно на 8,6 секунды на моем ПК.
import time
# These 4 lines make a large sample list-of-list to test on.
asc_sample0 = [[i] for i in range(500)]
asc_sample1 = [[i,j] for i in range(500) for j in range(20)]
asc_sample2 = [[i,j,k] for i in range(20) for j in range(10) for k in range(20)]
asc_sample = asc_sample0 + asc_sample1 + asc_sample2
start = time.clock()
cells0 = [i for i in asc if len(i) == 1]
cells1 = [i for i in asc if len(i) == 2]
cells2 = [i for i in asc if len(i) == 3]
print time.clock() - start
Я также попытался «вынуть» элементы и добавить в списки cell0 и т. Д., Но это заняло значительно больше времени. Я также попытался добавить, а затем удалить этот элемент, чтобы я мог пройти через один цикл, который работал нормально, когда были, скажем, 10^10 списков размера 1, но только несколько из 2 и 3 размеров, но, в общем, это было неэффективно.
В основном я ценю некоторые сообразительные идеи. Я знаю, что один из ответов, скорее всего, будет «Напиши это на С», но пока я просто хотел бы посмотреть на решения Python для этого.
Что точка 'L_3'? Вы только что сказали «len (list_i) <= 2' для всех списков в L. – slider
Возможно, вы можете получить значительное ускорение, сортируя список, а затем используя' itertools.groupby' –
@slider Извините; Я имел в виду, что это будет 3. Это немного запутанно, потому что в списках длины 1 обозначаются «0-ячейки», длина 1 указывает на «1-клетки» и т. Д., Поэтому я смешиваю пучок. Отредактировано, чтобы отразить это! – james