Python: вложенный цикл - PullRequest
       10

Python: вложенный цикл

2 голосов
/ 30 ноября 2009

Учтите это:

>>> a = [("one","two"), ("bad","good")]

>>> for i in a:
...     for x in i:
...         print x
... 
one
two
bad
good

Как я могу написать этот код, но используя такой синтаксис, как:

for i in a:
    print [x for x in i]

Очевидно, это не работает, печатает:

['one', 'two']
['bad', 'good']

Я хочу такой же вывод. Можно ли это сделать?

Ответы [ 8 ]

7 голосов
/ 30 ноября 2009

Учитывая ваш пример, вы можете сделать что-то вроде этого:

a = [("one","two"), ("bad","good")]

for x in sum(map(list, a), []):
    print x

Это может, однако, стать довольно медленным, когда список станет большим.

Лучший способ сделать это был бы такой: Тим Пицкер предложил:

from itertools import chain

for x in chain(*a):
    print x

Использование звездной записи , *a позволяет вам иметь n кортежей в списке.

7 голосов
/ 30 ноября 2009

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

from __future__ import print_function
for x in a:
    [print(each) for each in x]

это удивительно непитонно и приводит к созданию списка, который вам на самом деле не нужен. Лучшее, что вы могли бы сделать, это просто написать вложенные циклы for в вашем исходном примере.

4 голосов
/ 01 декабря 2009
>>> a = [("one","two"), ("bad","good")]
>>> print "\n".join(j for i in a for j in i)
one
two
bad
good



>>> for i in a:
...  print "\n".join(i)
... 
one
two
bad
good
3 голосов
/ 30 ноября 2009

Функция печати действительно лучше, но вот гораздо более питонное предложение, вдохновленное ответом Бенджамина Поллака:

from __future__ import print_function
for x in a:
    print(*x, sep="\n")

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

3 голосов
/ 30 ноября 2009
import itertools
for item in itertools.chain(("one","two"), ("bad","good")):
    print item

даст желаемый результат только с одной петлей for.

1 голос
/ 30 ноября 2009

Этот код прост и прост, чем другие решения здесь:

for i in a:
    print '\n'.join([x for x in i])
1 голос
/ 30 ноября 2009

Вам необходимо определить свой собственный метод печати (или импортировать __future__.print_function)

def pp(x): print x

for i in a:
  _ = [pp(x) for x in i]

Обратите внимание, что _ используется для указания того, что возвращаемый список следует игнорировать.

0 голосов
/ 30 ноября 2009

Не самый лучший, но:

for i in a:
    some_function([x for x in i])

def some_function(args):
    for o in args:
        print o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...