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

How can i print this in python using rows and cols?

在 python 中,我现在真的很困惑如何应用行和列(编辑:列表)来创建这篇文章。我正在创建一个 class Piece,它具有四个值(左、右、上和下)并随机生成(使用 randint(10, 99))。我也希望能够转动这件作品例如:

piece after 0 turns :

   30
83 00 34
   25

piece after 1 turns :

   83
25 00 30
   34

如果我理解正确的话,我就不会担心行和列了。我的 class 会在其构造方法 (__init__) 中生成随机值以粘贴在列表 (vals = [top, right, bottom, left]) 中,并且会有两种左右旋转的方法 (rotate_leftrotate_right) 和一种获取当前列表的方法 (get_vals)。

import random as rn

class Piece():

    def __init__(self):
        #vals = [top, right, bottom, left]        
        self.vals = [rn.randint(10,99) for _ in range(4)]
        self.n = 4

    def rotate_left(self):
        self.vals = [self.vals[i-self.n+1] for i in range(self.n)]

    def rotate_right(self):
        self.vals = [self.vals[i-1] for i in range(self.n)]

    def get_vals(self):
        return self.vals

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

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

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

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

为了可伸缩性,我建议我们生成一个无限序列,并根据需要调用值。我设计了 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",这样就向左旋转了。