使用 python3 的字符串格式打印:*有时*从解压缩的数组打印

String format printing with python3: print from unpacked array *some* of the time

在我的 中,我询问了当字符串存储在数组中时如何使用 python 的 str.format 打印进行打印。

然后答案很明显解压列表,像这样:

# 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-strings。

例如:

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    )----'
          \       /
           \_____/

我认为最简单的方法是将您的字母更改为 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

输出与上面相同

你可以用 .format() 来尝试这样的事情:

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

这将打印 3, 1, 2

通过这种方法,您的初始 hex_string 将 "self document" 您数组中的字母将准确地到达的位置。

如果您事先知道所需的顺序:

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))