Печать в строковом формате с помощью python3: печать из распакованного массива * некоторое время * - PullRequest
5 голосов
/ 11 мая 2019

В моем вопросе несколько минут назад я спросил о том, как печатать, используя str.format печать на python, когда строки хранятся в массиве.

Тогда ответ был явно распаковансписок, как это:

# note that I had to play with the whitespace because the {} text is 2 characters, while its replacement is always one

hex_string = r'''
            _____
           /     \
          /       \
    ,----(    {}    )----.
   /      \       /      \
  /   {}    \_____/   {}    \
  \        /     \        /
   \      /       \      /
    )----(    {}    )----(
   /      \       /      \
  /        \_____/        \
  \   {}    /     \   {}    /
   \      /       \      /
    `----(    {}    )----'
          \       /
           \_____/
'''

letters = list('1234567')

print(hex_string.format(*letters))

Но если я всегда хочу, чтобы центральный шестиугольник печатался внутри первого элемента в массиве: letters[0], как я могу смешать распаковку массива с сохранением 4-го напечатанногострока из первого элемента массива?

Я открыт для печати других типов, например, f-строк.

Например:

print(hex_string.format(letters[3], letters[1], letters[2], letters[0], letters[4], letters[5], letters[6]))

Так что мой вывод на самом делевыглядит так:

            _____
           /     \
          /       \
    ,----(    4    )----.
   /      \       /      \
  /   2    \_____/   3    \
  \        /     \        /
   \      /       \      /
    )----(    1    )----(
   /      \       /      \
  /        \_____/        \
  \   5    /     \   6    /
   \      /       \      /
    `----(    7    )----'
          \       /
           \_____/

Ответы [ 3 ]

5 голосов
/ 11 мая 2019

Вы можете попробовать что-то подобное с .format():

a = '123'
print('{2}, {0}, {1}'.format(*a))

что будет печатать 3, 1, 2

При таком подходе ваш начальный hex_string будет «самодокументирован», куда будут точно попадать буквы из вашего массива.

5 голосов
/ 11 мая 2019

Если вы заранее знаете необходимый заказ:

letters = list('1234567')
reordering = [4,2,3,1,5,4,7]

Вы можете применить это к буквам:

new_letters = [letters[index-1] for index in reordering]

Выход:

['4', '2', '3', '1', '5', '4', '7']

Теперь вы можете создать свою отформатированную строку:

print(hex_string.format(*new_letters))
1 голос
/ 11 мая 2019

Я думаю, что самый простой подход для этого - изменить ваши буквы на list('4231567'), что позволяет смешивать распаковку, а также избавляет от необходимости перемещаться по элементам в массиве

hex_string = r'''
            _____
           /     \
          /       \
    ,----(    {}    )----.
   /      \       /      \
  /   {}    \_____/   {}    \
  \        /     \        /
   \      /       \      /
    )----(    {}    )----(
   /      \       /      \
  /        \_____/        \
  \   {}    /     \   {}    /
   \      /       \      /
    `----(    {}    )----'
          \       /
           \_____/
'''

letters = list('4231547')

print(hex_string.format(*letters))

Вывод будетбыть


            _____
           /     \
          /       \
    ,----(    4    )----.
   /      \       /      \
  /   2    \_____/   3    \
  \        /     \        /
   \      /       \      /
    )----(    1    )----(
   /      \       /      \
  /        \_____/        \
  \   5    /     \   6    /
   \      /       \      /
    `----(    7    )----'
          \       /
           \_____/


Или, развивая идею, предложенную ниже, используйте str.format с индексами, определенными для распаковки исходной строки, но назначая разные элементы на разные позиции

hex_string = r'''
            _____
           /     \
          /       \
    ,----(    {3}    )----.
   /      \       /      \
  /   {1}    \_____/   {2}    \
  \        /     \        /
   \      /       \      /
    )----(    {0}    )----(
   /      \       /      \
  /        \_____/        \
  \   {4}    /     \   {5}    /
   \      /       \      /
    `----(    {6}    )----'
          \       /
           \_____/
'''

letters = list('1234567')

print(hex_string.format(*letters))

Это также даетвам лучше ориентироваться в том смысле, что вы знаете, что {0} будет содержать первый элемент списка, то есть 1

Вывод будет таким же, как указано выше

...