Беру свое заявление обратно. сумма не является победителем. Хотя быстрее, когда список невелик. Но производительность значительно снижается при увеличении списков.
>>> timeit.Timer(
'[item for sublist in l for item in sublist]',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10000'
).timeit(100)
2.0440959930419922
Суммарная версия все еще выполняется более минуты и еще не обработана!
Для средних списков:
>>> timeit.Timer(
'[item for sublist in l for item in sublist]',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
).timeit()
20.126545906066895
>>> timeit.Timer(
'reduce(lambda x,y: x+y,l)',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
).timeit()
22.242258071899414
>>> timeit.Timer(
'sum(l, [])',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]] * 10'
).timeit()
16.449732065200806
Использование небольших списков и timeit: number = 1000000
>>> timeit.Timer(
'[item for sublist in l for item in sublist]',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
).timeit()
2.4598159790039062
>>> timeit.Timer(
'reduce(lambda x,y: x+y,l)',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
).timeit()
1.5289170742034912
>>> timeit.Timer(
'sum(l, [])',
'l=[[1, 2, 3], [4, 5, 6, 7, 8], [1, 2, 3, 4, 5, 6, 7]]'
).timeit()
1.0598428249359131
Подробно это обсуждается здесь: rightfootin.blogspot.com/2006/09/more-on-python-flatten.html, обсуждая несколько методов сглаживания произвольно вложенных списков. Интересное чтение!
Некоторые другие ответы лучше, но причина вашей неудачи в том, что метод «extend» всегда возвращает None. Для списка длиной 2 он будет работать, но не вернет None. Для более длинного списка он будет использовать первые 2 аргумента, которые вернут None. Затем он переходит к None.extend (<третий аргумент>), что вызывает эту ошибку
Решение @ shawn-chin здесь более питоническое, но если вам нужно сохранить тип последовательности, скажем, у вас есть кортеж кортежей, а не список списков, тогда вы должны использовать reduce (operator.concat, tuple_of_tuples). Использование operator.concat с кортежами, кажется, работает быстрее, чем chain.from_iterables со списком.
coderhelper.com/questions/50259290/… (в этой статье объясняется разница между np.flatten () и tf.flatten () при использовании (статического и динамического) ndarray.
Является ли ваш список полностью двухуровневым? под этим я подразумеваю, является ли каждое целое число в списке, которое находится в другом списке, ровно двумя уровнями? (в отличие от некоторых целых чисел во вложенном списке и некоторых целых чисел непосредственно в первом списке). Тот факт, что у вас есть
[7]
в вашем списке (вместо7
), означает, что да, это совершенно двухуровневый список. Так разве не сработает такая простая вещь, какl2=[]
, за которой следует[l2.extend(i) for i in l]
?