flat_list = [item for sublist in l for item in sublist]
, что означает:
for sublist in l:
for item in sublist:
flat_list.append(item)
быстрее, чем ярлыки, опубликованные до сих пор. (l
- список сгладить.)
Вот соответствующая функция:
flatten = lambda l: [item for sublist in l for item in sublist]
Для подтверждения, как всегда, вы можете использовать модуль timeit
в стандартная библиотека:
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 143 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 969 usec per loop
$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(lambda x,y: x+y,l)'
1000 loops, best of 3: 1.1 msec per loop
Объяснение: ярлыки на основе +
(включая подразумеваемое использование в sum
), по необходимости, O(L**2)
, когда есть L подписок - как промежуточный список результатов продолжает увеличиваться, на каждом шаге создается новый объект промежуточного результирующего списка, и все элементы предыдущего промежуточного результата должны быть скопированы (а также несколько новых добавленных в конце). Таким образом (для простоты и без фактической потери общности) скажем, что у вас есть L подсписок из I предметов каждый: первые предметы I копируются взад и вперед L-1 раз, второй I - L-2 раза и т. Д .; общее количество экземпляров: I умножает сумму x для x от 1 до L, т. е. I * (L**2)/2
.
Понимание списка только генерирует один список, один раз и копирует каждый элемент (из его оригинальное место проживания в списке результатов) также ровно один раз.
Таблица, вероятно, уже существовала из предыдущего прогона без ваших изменений и все еще имеет 5 столбцов в базе данных (CREATE TABLE IF NOT EXISTS). Вы можете проверить это, войдя в sqllite из ADP. Просто отпустите таблицу перед запуском приложения.
Кроме того, укажите список столбцов с вашими заявлениями вставки. Это хорошая практика, потому что ваше приложение будет более надежным в отношении изменений схемы:
"INSERT INTO " + TABLE_NAME + " (Name, Street, Block, City) Values (" ...etc