Возвращает значения из цикла for в python - PullRequest
2 голосов
/ 27 февраля 2011

Я пытаюсь выяснить синтаксис для передачи аргументов из одного списка или dict другому в синтаксисе цикла for.

Желаемый результат, который я ищу, таков:

 for bean in beans:
  if bean.type == 'coffee':
   print bean

Только вместо того, чтобы печатать на стандартный вывод, я бы хотел собрать эти строковые данные и добавить их в другой список. Со временем список сглаживается.

Кикер, я хочу выполнить это в одной строке.

Мне известен метод '' .join (), я ищу этот результат, чтобы отфильтровать результаты из цикла for-in.

Ответы [ 3 ]

10 голосов
/ 27 февраля 2011
[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).Для обобщенного решения, включающего абриатное глубокое вложение, вам нужна полная функция, использующая рекурсию.

8 голосов
/ 27 февраля 2011

Одна строка будет использовать списки или генераторы, см. Ответ Блэра.

Адаптация вашего текущего кода подойдет для ключевого слова yield , которое позволяет вам создать функцию генератора, напримерthis:

def coffee_filter(beans):
    for bean in beans:
       if bean.type == 'coffee':
           yield bean

for bean in coffee_filter(beans):
    print "coffee from %s" % bean.country

Поскольку python позволяет вам определять функции практически везде, это действительно полезно.

1 голос
/ 27 февраля 2011
'\n'.join([str(bean) for bean in beans if bean.type == 'coffee'])
...