2017-02-07 9 views
0

Я могу распечатать вложенные списки по строкам, используя для цикла и "" .join(), отображающий каждый int во вложенном списке на str с помощью map().Печать вложенных списков строк за строкой без цикла

Пример:

>>> ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
>>> for xs in ys: 
...  print(" ".join(map(str, xs))) 
... 
1 2 3 
4 5 6 
7 8 9 10 

Но я пытаюсь выяснить, как сделать это снова без для петель, которые могут поддерживать произвольные длины внутренних списков. Какие-либо предложения?

+1

Есть ли конкретная причина вы избегаете для цикла ? – Carcigenicate

+0

Не совсем ... Я просто хотел практиковать решение проблемы с разными подходами. – pewnienewbie

+0

Итак, вы говорите, что списки в списках могут идти глубже? Как у вас есть список в списке в списке? – kbunarjo

ответ

3

Поскольку глубина известна и фиксирована, вы можете гнездо 2 map заявление в однострочнике, используя lambda, чтобы избежать пониманий (что повлечет за собой for петли)

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print("\n".join(map(lambda xs : " ".join(map(str, xs)),ys))) 

нет for цикла, по крайней мере, не видно.

С точки зрения производительности, map выполняет цикл, но, вероятно, скомпилирован, поэтому он быстрее. С другой стороны, join должно знать размер входного так list создаются из ряда итерации в любом случае, и join+ список понимания затем быстрее (не в Python 2, где map возвращает list). Одним словом: используйте timeit, чтобы определить самый быстрый вариант с вашим контекстом.

+0

Спасибо! Было бы целесообразно использовать 2 оператора карты. Я не думал об этом методе! – pewnienewbie

+0

Вопросы производительности, когда вы думаете о 'map' vs for-loop или' map' vs 'comprehension', не так прямолинейны. См. Http://stackoverflow.com/a/39046254/5014455. Кроме того, добавлено усложнение, что встроенные функции, как правило, отображаются быстрее с помощью 'map', по сравнению с эквивалентным списком, но пользовательские функции показывают противоположный шаблон (постижение карты быстрее, чем 'map'). –

+0

@ juanpa.arrivillaga 'timeit' будет единственным судьей :) –

1
ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print "\n".join([" ".join(map(str,subList)) for subList in ys]) 

Код Разъяснение:

[" ".join(map(str,subList)) for subList in ys]

Это создало список строки с каждым значением каждого списка в сочетании с пробелом.

["1 2 3", "4 5 6", "7 8 9 10"]

"\n".join() довольно самостоятельно explantory после этого.

EDIT:

Обновлено использовать lambda вместо for.

ys = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]] 
print "\n".join(map(lambda x: " ".join(map(str,x)),ys)) 
+1

В вашем ответе есть' for' ... –

+0

Да, это имело бы смысл, кроме как для. Спасибо хоть! Интересное решение. – pewnienewbie

+0

@pewnienewbie, я обновил это, чтобы использовать 'lambda' вместо' for'. Не уверен, что все будет хорошо. – Michael

1

В рекурсивной функции для любой длины/глубины списков:

def recursive_print_list(param): 
    while len(param) > 0: 
     if isinstance(param[0], list): 
      recursive_print_list(param[0]) 
      print("") 
      param = param[1:] 
     else: 
      print(param[0], '', end='') 
      param = param[1:] 

Стоит отметить, что две другие ответы не будут работать на глубине> 2. Это будет. Он также полагается на неявное преобразование print() s в строку и поэтому будет работать на любом смешанном входе, пока вы можете print(element) всех элементов.


Оригинал Ответ:

xs = ys[:] # copy the original list, as this method is destructive 
while True: 
    try: 
     print " ".join(map(str, xs[0])) 
     xs = xs[1:] 
    except IndexError: 
     break 

будет работать для любых вложенных списков целых чисел.

Вы можете использовать тот же метод, чтобы избежать вызова карты, а также: Python 3:

xs = ys[:] 
while True: 
    if len(xs) == 0: 
     break 
    subl = xs[0][:] 
    while True: 
     try: 
      print(subl[0], ' ', sep='', end='') 
      subl = subl[1:] 
     except IndexError: 
      print("") 
      break 
    xs = xs[1:] 

Python 2.7:

xs = ys[:] 
while True: 
    if len(xs) == 0: 
     break 
    subl = xs[0][:] 
    while True: 
     try: 
      print subl[0], 
      subl = subl[1:] 
     except IndexError: 
      print "" 
      break 
    xs = xs[1:]