为什么我的单子不并排打印?

2024-06-08 05:22:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写一个程序,希望骰子能并排打印。但是,实际输出仅将第二个模具的上基座放置在第一个模具的下基座旁边。有人能帮我理解为什么会这样吗?你知道吗

die1 = ('+-------+\n|       |\n|   *   |\n|       |\n+-------+')
die2 = ('+-------+\n| *     |\n|       |\n|     * |\n+-------+')
die3 = ('+-------+\n| *     |\n|   *   |\n|     * |\n+-------+')
die4 = ('+-------+\n| *   * |\n|       |\n| *   * |\n+-------+')
die5 = ('+-------+\n| *   * |\n|   *   |\n| *   * |\n+-------+')
die6 = ('+-------+\n| * * * |\n|       |\n| * * * |\n+-------+')

list_die = ['0', die1, die2, die3, die4, die5, die6]

x = list_die[1]+'   ' + list_die[2]
print(x)

my output
+-------+
|       |
|   *   |
|       |
+-------+   +-------+
| *     |
|       |
|     * |
+-------+

Tags: 程序outputmy骰子listprint模具die
3条回答

尝试使用zip和列表

要让它们并排打印,你需要用拉链把它们包起来

die1 = ('+   -+','|       |','|   *   |','|       |','+   -+')
die2 = ('+   -+','| *     |','|       |','|     * |','+   -+')
die3 = ('+   -+','| *     |','|   *   |','|     * |','+   -+')
die4 = ('+   -+','| *   * |','|       |','| *   * |','+   -+')
die5 = ('+   -+','| *   * |','|   *   |','| *   * |','+   -+')
die6 = ('+   -+','| * * * |','|       |','| * * * |','+   -+')

list_die = ['0',die1,die2,die3,die4,die5,die6];

die_a = list_die[1];
die_b = list_die[2];

for line in zip(die_a,die_b):
    print line;

output:
('+   -+', '+   -+')
('|       |', '| *     |')
('|   *   |', '|       |')
('|       |', '|     * |')
('+   -+', '+   -+')

分解得到单独的行,连接这些行,然后重新连接。请注意,最终结果的\n少于原始字符串的简单串联:

def pair(i,j):
    linesI = list_die[i].split('\n')
    linesJ = list_die[j].split('\n')
    return '\n'.join(x+y for x,y in zip(linesI,linesJ))

例如

>>> print(pair(1,2))
+   -++   -+
|       || *     |
|   *   ||       |
|       ||     * |
+   -++   -+

在编辑时;反复拆分相同的字符串是低效的。保留原始定义,可以使用以下行:

list_die = ['0',die1,die2,die3,die4,die5,die6]
list_die = [d.split('\n') for d in list_die]

现在list_die包含拆分。你知道吗

您现在只需使用:

def pair(i,j):
    return '\n'.join(x+y for x,y in zip(list_die[i],list_die[j]))

其功能与上述相同。你知道吗

冒着太可爱的风险,你可以制作一个更灵活的版本,可以在一行上打印任意数量的骰子(对于编写冒险游戏或Yahtzee非常有用,通常需要三个或更多的骰子):

def dice(*args):
    return '\n'.join(''.join(t) for t in zip(*(list_die[i] for i in args)))

例如:

>>> print(dice(1))
+   -+
|       |
|   *   |
|       |
+   -+
>>> print(dice(1,2))
+   -++   -+
|       || *     |
|   *   ||       |
|       ||     * |
+   -++   -+
>>> print(dice(3,1,4))
+   -++   -++   -+
| *     ||       || *   * |
|   *   ||   *   ||       |
|     * ||       || *   * |
+   -++   -++   -+

在进一步编辑时:您可以在不使用zip的情况下执行此操作,但代价是使代码更长。zip是为并行迭代而设计的。例如,您将一对并排的骰子组合在一起,但将两个骰子面平行地向下迭代。如果不使用zip,则需要使用列表索引来保持迭代的并行性。例如,pair()的第二个版本(其中list_die包含已经分割成线的骰子面)看起来像:

def pair(i,j):
    lines = []
    for k in range(len(list_die[i])):
        lines.append(list_die[i][k] + list_die[j][k])
    return '\n'.join(lines)

这是可行的,但它的长度超过了200%(5行而不是2行)。你知道吗

要回答为什么会发生这种行为的问题,请注意对print和显式\n的调用会在文本中插入一个换行符,这会强制输出向下一行。你知道吗

除非您使用操纵控制台的代码,否则一旦您下线,就无法返回。从左到右,从上到下打印,就像打印机一样。你不能取消打印。你知道吗

如果您想要此功能,请查看图形库 . 诅咒是C++的简单GOTO库,并且可以有一个Python等价物。你知道吗

当然,正如其他答案所提到的,您可以将文本并排格式化,这对于您当前的目的可能是更好的选择。你知道吗

相关问题 更多 >

    热门问题