[bean for bean in beans if bean.type == 'coffee']
Понимание списка аккуратно.Даже точнее, часто вам не нужно создавать целый список - вам просто нужен итератор, который дает вам значения, из которых будет состоять список.Это генератор, и они могут быть выражены так же кратко через выражения генератора.Они пишутся так же, как и списки, за исключением того, что квадратные скобки становятся паренами (и вы можете опустить их, если это единственный аргумент в вызове функции), например, '\n'.join(str(bean) for bean in beans if bean.type == 'coffee')
.Преимущество заключается в упомянутой лени, то есть вы никогда не генерируете значения, пока они действительно не нужны (запрошены), и вы не храните все их в памяти одновременно (если, конечно, потребитель не сделает этого).
Вы можете использовать itertools.chain
для объединения нескольких итераций (включая списки) в один, или если вы не можете изменить факт получения списков списков, вы можете использовать (x for list in lists for x in list)
.Для обобщенного решения, включающего абриатное глубокое вложение, вам нужна полная функция, использующая рекурсию.