为什么我的列表并排打印?

时间:2017-03-22 23:06:44

标签: python string python-3.x

我正在编写一个程序,我希望骰子可以并排打印。然而,实际输出仅将第二管芯的顶部基座放置在第一管芯的底部基座旁边。任何人都可以帮助我理解为什么会这样吗?

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
+-------+
|       |
|   *   |
|       |
+-------+   +-------+
| *     |
|       |
|     * |
+-------+

3 个答案:

答案 0 :(得分:0)

尝试使用zip和列表

要让它们并排打印,您需要使用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:
('+-------+', '+-------+')
('|       |', '| *     |')
('|   *   |', '|       |')
('|       |', '|     * |')
('+-------+', '+-------+')

答案 1 :(得分:0)

分开获取各行,连接这些行,然后重新加入。请注意,最终结果比原始字符串的简单串联少\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]))

其功能与上述相同。

冒着有点太可爱的风险,你可以制作一个更灵活的版本,可以在一行上打印任意数量的骰子(例如用于编写Risk或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行)。

答案 2 :(得分:0)

要回答为什么会出现这种情况的问题,请注意您对print和显式\n的调用会在文本中插入换行符,这会强制输出一行。

除非你使用操纵控制台的代码,否则一旦你走了一条线,你就无法恢复。您可以像打印机一样从左到右,从上到下打印。你无法打印。

如果您需要此功能,请查看图形库 。 Curses是C ++的简易goto库,可能有python等价物。

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