在python中,我现在真的很困惑如何应用行和列(编辑:列表)来创建这个片段。我正在创建一个类Piece
,它有四个值(左,右,上和下)并随机生成(使用randint(10, 99)
)。我也希望能够以此为例:
piece after 0 turns :
30
83 00 34
25
piece after 1 turns :
83
25 00 30
34
答案 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”,以便它向左旋转。