我如何使用行和列在python中打印这个?

时间:2016-02-21 05:30:38

标签: python puzzle

在python中,我现在真的很困惑如何应用行和列(编辑:列表)来创建这个片段。我正在创建一个类Piece,它有四个值(左,右,上和下)并随机生成(使用randint(10, 99))。我也希望能够以此为例:

piece after 0 turns :

   30
83 00 34
   25

piece after 1 turns :

   83
25 00 30
   34

2 个答案:

答案 0 :(得分:0)

如果我理解正确,我不会担心行和列。我的类会在其构造函数方法(__init__)中生成随机值以粘贴到列表(vals = [top, right, bottom, left])中,并且有两种方法可以左右旋转(rotate_left和{{1} })和一个获取当前列表的方法(rotate_right)。

get_vals

使用此列表旋转只是将值向左或向右移动一个索引。

编辑:这是用python 3.4编写的,但它也适用于2.7。

答案 1 :(得分:0)

我有类似的实现 - 除了使用生成器和itertools

@wrkyle正在做的是他正在通过构建新列表来替换值。想象一下,如果你想旋转1000000000次。你必须构建一个新的列表10万次。它的内存效率不高。

对于可伸缩性,我建议生成一个无限序列,并根据需要调用这些值。我设计了rotate方法,以便它获取转数的参数;这样,用户就没有使用任何循环来循环切片 - 只需计算要移位的位置数,并更新一次。

from itertools import cycle, islice
from random import randint

class Piece:

    def __init__(self):
        self._values = cycle([randint(10, 99) for _ in range(4)])
        self._turns = 0

    def __str__(self):
        positions = list(islice(self._values, 0, 4))
        disp = (
            "piece after %s turns:" % (self._turns) + "\n\n" +
            "   %s   \n" % (positions[0]) +
            "%s 00 %s\n" % (positions[3], positions[1]) +
            "   %s   \n" % (positions[2])
        )
        return disp

    def rotate(self, num_turns, direction="right"):
        self._turns += num_turns
        if direction == "right":
            self._values = cycle(islice(self._values,
                                        2 + num_turns % 4,
                                        6 + num_turns % 4)
                                 )
        else:
            self._values = cycle(islice(self._values,
                                        0 + num_turns % 4,
                                        4 + num_turns % 4)
                                 )

现在,如果您运行以下代码,则向右旋转 -

p = Piece()

# rotate 4 times
for _ in range(4 + 1):
    print(p)
    p.rotate(1, direction="right")

你得到:

piece after 0 turns:

   57   
86 00 89
   14   

piece after 1 turns:

   86   
14 00 57
   89   

piece after 2 turns:

   14   
89 00 86
   57   

piece after 3 turns:

   89   
57 00 14
   86   

piece after 4 turns:  # confirm it returns to original position

   57   
86 00 89
   14 

当然,您可以将rotate方法的默认参数更改为“left”,以便它向左旋转。