Идиоматический способ печати произвольного количества элементов из списка в каждой строке

#python

#python

Вопрос:

Я хочу распечатать данные из списка, такие как:

 ['0.10', '0.15', '-0.25', '0.30', '1.50', '1.70']
  

Однако вместо печати одного элемента в списке с использованием чего-то вроде:

 for item in list:
    print item
  

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

Пример вывода, который мне мог бы понравиться, был бы:

 0.10   0.15  -0.25
0.30   1.50   1.70
  

Или:

 0.10   0.15  -0.25   0.30
1.50   1.70
  

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

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

1. Что не так с рецептом grouper? Вероятно, это лучшее, что вы можете получить.

2. Я не думал, что в этом было что-то не так, я просто не очень хорошо разбираюсь в идиомах Python, и мне было интересно, знает ли кто-нибудь быстрый способ.

3. Единственное, что мне не нравится в grouper receipte (и нескольких других), это то, что это рецепт, а не функция. На какой планете копирование и вставка лучше импорта?

Ответ №1:

Это работает. Это кажется довольно простым.

 for i in range(0, len(some_list), line_length):
    print( some_list[i:i line_length] )
  

Если вы хотите буквальное форматирование, показанное в вопросе, вам нужно будет сделать что-то вроде этого.

 for i in range(0, len(some_list), line_length):
    print( "  ".join( "{0:.2f}".format(x) for x in some_list[i:i line_length] ) )
  

Ответ №2:

Еще одна (возможно) более простая версия:

 mylist = ['0.10', '0.15', '-0.25', '0.30', '1.50', '1.70']
line_items = 3

for n, item in enumerate(mylist):
    if (n 1) % line_items:
        print item,
    else:
        print item
  

выдает:

 0.10 0.15 -0.25
0.30 1.50 1.70
  

Ответ №3:

Думаю, это решение немного более понятно:

 a = ['0.10', '0.15', '-0.25', '0.30', '1.50', '1.70']
body = []
length = 2
for b in xrange(len(a)):
    body.append(str(a[b]))
    if b % length:
        body.append("n")
    else:
        body.append("t")
print "".join(body)
  

Надеюсь, это поможет 🙂

PS: И на самом деле решение только для одной печати может быть полезно в списках, содержащих много переменных.