Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/75: Рейтинг темы: голосов - 75, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 2

Как из списка удалить пустые списки?

30.10.2013, 00:33. Показов 15419. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
например есть такое
Python
1
ls = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '], ['5 '], ['6 '], ['7 '], ['8 '],[]]
как удалить пустые [] ?
например так

Python
1
2
3
for i,d in enumerate(ls):
    if d==[]:
        del ls[i]
не удаляет =(

Добавлено через 8 минут
а все вопрос решен ) не нашел кнопку как удалить тему
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.10.2013, 00:33
Ответы с готовыми решениями:

Удалите пустые списки из списка строк
Доброго времени суток, столкнулся с такой задачей. Задача максимально лёгкая, но у меня возникли некоторые трудности. (Фотография задачи...

Удалить из заданного списка пустые списки
Помогите, пожалуйста, на Scheme: удалить из заданного списка пустые списки

Удалить все пустые элементы из списка списков
Дан список списков (List<List<string>>) , из него надо удалить все пустые списки. В простом строковом списке вроде можно сделать так: ...

14
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.10.2013, 00:59
Python
1
2
3
4
5
>>> ls = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '], ['5 '], ['6 '], ['7 '], ['8 '], []]
>>> ls = list(filter(None, ls))
>>> ls
[['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '], ['5 '], ['6 '], ['7 '], ['8 ']]
>>>
1
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 2
30.10.2013, 01:29  [ТС]
а мне тут подсказали можно сделать так, какой из вариантов оптимальней даже и не знаю
Python
1
ls = [x for x in ls if x]
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.10.2013, 06:58
Цитата Сообщение от allozar Посмотреть сообщение
какой из вариантов оптимальней даже и не знаю
выбирать нужно между filter() и включением
я сравнил через timeit: на небольших списках твой немного быстрее, а на больших списках твой медленнее в два раза
(а с del вообще в десять раз медленнее твоего)

Добавлено через 3 минуты
Code
1
2
3
4
5
[guest@localhost py]$ ./timecmp.py 
[0.22660166999958165, 0.22645385499981785, 0.22690548299942748]
[0.5606995429998278, 0.5607934289992045, 0.5594335770001635]
[1.7001144109999586, 1.7018712059998506, 1.7051744469999903]
[guest@localhost py]$
мой
твой
твой с del
0
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 2
11.09.2016, 12:13
Доброго времени!

Вопрос сходный, но более глубокий.
Мне требуется из вложенных списков удалить строки типа ' '.
Фильтрация
Python
1
h= filter(lambda x: x !='', b)
и перебор через IF
Python
1
2
3
4
5
6
7
8
for w in b:
    for elem in w:
        if elem != '':
            b[b.index(w)][w.index(elem)]=elem            
        elif elem == '':
            w.pop(w.index(elem))
        else:
            w.remove(elem)
не помогают.

Как полностью убрать пустые элементы из строк?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.09.2016, 13:33
Могу предложить пересоздание списка.
Python
1
2
3
4
5
6
7
8
9
10
11
ls = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '], ['5 '], ['6 '], ['7 '], ['8 '],[]]
 
ls2 = []
for i in range(len(ls)):
    ls2.append([])
    for el in ls[i]:
          if el != '': ls2[i].append(el)
ls = ls2
del ls2
print(ls)
# [[], [], ['1 ', 'en'], ['2 '], ['3 ', '100'], ['4 '], ['5 '], ['6 '], ['7 '], ['8 '], []]
1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 13:48
WhiteSadKat, через рекурсию
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def clear(l):
    for e in l:
        if isinstance(e, list):
            clear(e)
        if isinstance(e, str) and len(e) == 0:
            l.remove(e)
 
def main():
    a = [1, "", 2, ["3", "", "4", ["5", "", "6"], "7"], "8", "", "9"]
 
    clear(a)
 
    print(a)
 
 
if __name__ == "__main__":
    main()
1
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
11.09.2016, 14:07
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import timeit
 
 
def test1():
    data = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '],
            ['5 '],
            ['6 '], ['7 '], ['8 '], []]
 
    for i, sequence in enumerate(data):
        if all(sequence):
            continue
        for j, elem in enumerate(sequence):
            if not elem:
                del data[i][j]
 
 
def test2():
    ls = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '], ['5 '],
          ['6 '], ['7 '], ['8 '], []]
 
    ls2 = []
    for i in range(len(ls)):
        ls2.append([])
        for el in ls[i]:
            if el != '': ls2[i].append(el)
    ls = ls2
    del ls2
 
 
def test3():
    def clear(l):
        for e in l:
            if isinstance(e, list):
                clear(e)
            if isinstance(e, str) and len(e) == 0:
                l.remove(e)
 
    data = [[], [], ['1 ', 'en', ''], ['2 '], ['3 ', '', '100'], ['4 '],
            ['5 '],
            ['6 '], ['7 '], ['8 '], []]
    clear(data)
 
print(timeit.timeit("test1()", setup="from __main__ import test1", number=100000))
print(timeit.timeit("test2()", setup="from __main__ import test2", number=100000))
print(timeit.timeit("test3()", setup="from __main__ import test3", number=100000))
0.2915975389769301
0.39930287800962105
0.8246724310447462
2
0 / 0 / 0
Регистрация: 11.09.2016
Сообщений: 2
11.09.2016, 14:26
Garry Galler, Avazart, alex925, благодарю за оперативность!
Выбрал решение от Garry Galler как быстрое и понятное для моего уровня!
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 14:33
WhiteSadKat,
Цитата Сообщение от WhiteSadKat Посмотреть сообщение
Выбрал решение от Garry Galler
Да только там не будет работать с тройной и выше вложенностью.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
11.09.2016, 14:35
Цитата Сообщение от Avazart Посмотреть сообщение
Да только там не будет работать с тройной и выше вложенностью.
Ну, судя по всему ему это подходит, почему не использовать. Ну, а рекурсия в Python это очень не очень выбор, даже по профилировщику это видно и я ещё молчу про жор памяти и исчерпание глубины рекурсии.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 14:36
Цитата Сообщение от alex925 Посмотреть сообщение
Ну, а рекурсия в Python это очень не очень выбор, даже по профилировщику это видно и я ещё молчу про жор памяти и исчерпание глубины рекурсии.
Это оптимальный выбор в плане ясности.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
11.09.2016, 14:37
Цитата Сообщение от WhiteSadKat Посмотреть сообщение
как быстрое
Оно не самое быстрое вообще-то, если ты не заметил + там не нужная перетасовка список зачем-то....

Цитата Сообщение от Avazart Посмотреть сообщение
Это оптимальный выбор в плане ясности.
Спорный момент, очень спорный.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.09.2016, 14:39
Цитата Сообщение от alex925 Посмотреть сообщение
и исчерпание глубины рекурсии.
Ну я не думаю что там будет такое, вложенность вряд ли то будет большая вложенность.
Кроме того тут все по ссылкам так что и по памяти не большие затраты.

Цитата Сообщение от alex925 Посмотреть сообщение
Спорный момент, очень спорный.
Ну попробуйте соорудить аналогичный код без рекурсии и станет очевидно.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
11.09.2016, 17:18
Цитата Сообщение от alex925 Посмотреть сообщение
+ там не нужная перетасовка список зачем-то.
Согласен. Использование enumerate (пока не успел привыкнуть к нему) + прямое удаление в данном случае получается более эффективным и логичным, чем пересоздание.

Но есть один нюанс мне не совсем ясный.
Функция all(seq) проверяет все ли элементы последовательности True, но логично ли что она возвращает True даже на пустом списке? Да, я знаю, что в python пустой список в булевом контексте True. Но ведь функция судя по документации должна проверять его содержимое, а пустое содержимое как-то не вяжется с True.
Вот all([None]), не вызывает вопросов, так как возвращает ожидаемое False.

Добавлено через 21 минуту
----
Пустой список оказывается все-таки не True - это я ошибся. Ну тогда тем более непонятно зачем all([]) возвращает True.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2016, 17:18
Помогаю со студенческими работами здесь

Удалить из списка все элементы, содержащие пустые строки файла
в двунаправленном списке записаны данные текстового файла . удалить из списка все элементы , содержащие пустые строки файла

Удалить из списка списки
Удалить из списка списки при помощи макроса, если можно то код

Удалить из списка одноуровневые списки
Вот задача. Напишите функцию (f L), которая выдает список, получающийся после удаления из списка L всех элементов, представляющих собой...

Удалить из списка списки размерностью 2
Удалить из списка списки размерностью 2 (DrScheme)

Как правильно создавать пустые списки?
Доброго времени суток. Создаю пустой список matrix = Потом пытаюсь заполнить его разными элементами (целыми числами), но ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru