我正在制作地图编辑器,您可以在其中选择X
和Y
的尺寸。
在我的例子中,我将使用6x6
板。使用Tkinter,我的值存储在字典中,并以这种格式出现在数组中:
{(0,"floor"), (1,"floor"), (2,"wall"), ..., (35,"wall")}
我想要做的是使用二维数组格式的值:
{([0,0],"floor"),([0,1],"floor"), ([0,2],"wall"), ..., ([5,5],wall)}
这是我正在尝试的草案代码,但似乎并不像我想要的那样工作:
valueX = 6
valueY = 6
totalSize = valueX * valueY
matrix = []
for i in range(totalSize):
matrix.append([i/valueX,i%valueY])
这适用于6x6
矩阵,但是当我尝试像6x10
这样的不规则大小时,它无法获得我想要的结果。
这是我想要的结果:
[0,0] [0,1]...[0,9],[0,10],[1,0]...
这是我得到的:
[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 0], [1, 1]]
答案 0 :(得分:1)
您对坐标的计算不正确 - 我相信这应该会更好:
matrix.append([i/valueY, i%valueY])
第一个坐标需要是你的X值,对于列表中的每个“valueY”元组,它将递增一次,因此除以valueY。
第二个坐标需要是你的Y值,它在0到valueY-1的范围内,所以i modulo valueY负责处理。
我认为代码是一个简化的例子,因为它根本不会尝试处理源数据元组。
答案 1 :(得分:0)
我同意马特乔丹的观点。只需确保您确保这些操作的int输出:
matrix.append([int(i/valueY), i%valueY])
,Python 3会给你带来问题(如果你导入除法,甚至是2.x)。此外,您始终可以按照更“直观”的方式构建此类可迭代(尽管速度较慢):
matrix = []
for x in range(valueX):
for y in range(valueY):
matrix.append([x,y])
如果要先行X和Y秒行,可以更改循环的顺序。
答案 2 :(得分:0)
首先,让我们清楚一些事情。 Python中没有键的字典称为set。在REPL:
>>> x = {1,2,3}
>>> x
{1, 2, 3}
>>> x = {1,2,3,1}
>>> x
{1, 2, 3}
我们可以看到一个集合将删除重复的项目。当我们谈论集合时,我们必须要小心(最常见的是没有排序,没有重复),当我们讨论lists(有订单并且可以包含重复项)时。
其次,“二维数组”隐含地指示元素在二维平面中的存在位置(通常称为“矩阵”):
>>> y = [['a','b','c'],['d','e','f']]
>>> y[0][1]
'b'
>>>y[1][0]
'd'
这与您正在构建的内容略有不同:
>>> z = [([0,0], 'a'), ([0,1], 'b'), ([0,2], 'c'), ([1,0], 'd'), ([1,1], 'e'), ([1,2], 'f')]
>>> z[1]
([0, 1], 'b')
>>> z[3]
([1, 0], 'd')
因此非常重要确定您希望函数执行的操作。之一:
f(list of tuples) -> (list of tuples, with each tuple being tagged with it's coordinate)
或者:
f(list of tuples) -> (list of list of tuples, with each tuple having it's original index)
如果是前者:
new_list = list()
xDimension = 6
yDimension = 6 # Not actually used!
for (idx, element) in original_list:
y = int(idx / valueX) # rounds down
x = idx % valueX
new_list.append(([x,y], element))
请注意,上面没有列表长度不匹配的问题。无论原始列表是否“适合”所需的矩阵大小,每个元组都将使用坐标进行标记。此外,如果它太短,则不会出现错误。这是因为我们只是遍历原始列表。
如果是后者:
xDimension = 6
yDimension = 6
matrix = list()
for y in range(yDimension):
row = list()
for x in range(xDimension):
idx = y*xDimension + x
row.append(original_list[idx])
matrix.append(row)
如果空间不足,matrix
可能不包含原始列表中的所有元素。但是,它会将元组排列成所需大小的多维数组。