Сгладить список, состоящий из объектов, или список без isintance

#python

Вопрос:

Имея список, подобный:

 l = [0, 1,[2, 3], 4, 5, [6, 7], {1, 2}]
 

Я могу сгладить его с помощью:

 from collections.abc import Iterable
aux = []
for e in l:
   if not isinstance(e, Iterable):
       aux.append(e)
   else:
       aux.extend(e)
 

Существует ли однострочный вариант без проверки типов для решения этой задачи?

Комментарии:

1. Знаете ли вы о внутренних элементах. Это всегда целые числа или они могут быть строками или чем-то еще? Как насчет наборов / кортежей, нужно ли их также сглаживать? Может ли быть более одного уровня вложенности?

2. может быть любым объектом. Вот почему я различаю итерацию или нет при проверке if.

3. Зачем вам однострочный? Код кажется мне довольно хорошим

4. Вы можете использовать утиный ввод, например, попробовать iter(e) или просто попробовать перебрать его, но зачем вам это делать? И зачем вам однострочный? Почему количество строк имеет значение?

5. Вы могли бы сделать только для одного уровня вложенности: [x for sub in l for x in getattr(sub, "__iter__", lambda: [sub])()] но это своего рода проверка псевдотипа. Он также сгладит строки в их символы.

Ответ №1:

Попробуй это:-

Труба pypi

 from pipe import traverse
l = [0, 1,[2, 3], 4, 5, [6, 7], {1, 2}]
aux=list(l | traverse)
 

Вывод:-

 [0, 1, 2, 3, 4, 5, 6, 7, 1, 2]
 

Комментарии:

1. traverse вероятно, просто выполняет эквивалент кода OP уже…

2. Я узнал кое-что новое! И это работает, если есть более глубокая вложенность.

3. @Bibhav откуда вы знаете, что это не выполняет проверку типов?

4. @juanpa.arrivillaga Да. Это в значительной степени так

5. @user17189165 но вы явно просите способ без проверки типа в вашем исходном вопросе, и тогда все в порядке, если проверка типа выполняется в каком-либо стороннем модуле? Тогда вы могли бы с таким же успехом перенести свой исходный код в другой модуль.