l.emplace_back()
每当我运行此代码时,都会出现此错误:
data = [0, 2, 4, 8, 0, 2, 8, 0, 0, 0, 0, 2, 4, 2, 2, 0]
def drawBoard(): # Making the board into a 2d array
count = 0
for i in range(16):
print(data[i], end = ' ')
count += 1
if count == 4:
print("")
count = 0
drawBoard()
data = zip(*data[::-1])
data = data[::-1]
for col in range(4):
count = 0
for row in range(4):
if data[row*4+col] != 0:
data[count*4+col] = data[row*4+col]
for row in range(count, 4):
data[row*4+col] = 0
data = data[::-1]
data = list(zip(*reversed(data)))
drawBoard()
在这一行:
TypeError: zip argument #1 must support iteration
我已经看过其他人问过这个问题和答案,但是我无法解决。
有人可以告诉我为什么会出现此错误以及如何解决此问题。
答案 0 :(得分:2)
您的根本问题似乎是您认为drawBoard
函数正在将draw
从一维数组转换为二维数组。但事实并非如此。它所做的只是打印 draw
的二维数组表示形式,根本不更改值。最后,您仍然只有一个普通的旧列表。
尝试zip(*…)
转置一维数组(数字列表)没有任何意义。如果您有2D数组(数字列表的列表),那么将有意义。而且您认为您有一个2D数组,这就是为什么您对代码无法正常工作感到困惑的原因。
因此,显而易见的解决方案是使自己成为要使用的列表的列表。如果要使板子成为列表列表的功能,则必须编写一个,但这很容易。请参阅this question,以了解对列表元素进行分组或分组以及选择所需元素的多种方法。然后:
def makeSquare(lst):
width = int(len(lst) ** .5)
if width * width != len(lst):
raise ValueError('List length must be a perfect square')
return list(chunkifier_that_you_chose(lst, width))
现在,您可以将其用作2D数组,从而使所有其余代码变得更加简单:
board = makeSquare(data)
def drawBoard(board):
for row in board:
for col in row:
print(col, end = ' ')
print()
drawBoard(board)
flippedBoard = zip(*board[::-1])
drawBoard(flippedBoard)
如果您确实想使列表保持平坦,而用zip(*…)
对其进行翻转,则可以对它进行平方处理,翻转,然后再次对其进行展平:
board = makeSquare(data)
flippedBoard = zip(*board[::-1])
flat = [col for row in flippedBoard for col in row]
请注意,由于您一直在谈论数组,并尝试将列表作为数组使用,因此是否考虑使用NumPy?即使您出于某种原因希望使所有内容保持平坦,NumPy仍可让您重塑相同数据的视图(无需复制任何内容,只需制作一个新的“查看器”手柄),即可更轻松地进行操作:< / p>
import numpy as np
data = np.array(data)
data.reshape(4, 4) # as a 2D array
data.reshape(4, 4)[::-1] # reversed
data.reshape(4, 4)[::-1].T # reversed and transposed
data.reshape(4, 4)[::-1].T.reshape(16) # reversed, transposed, back to 1D
答案 1 :(得分:0)
目前尚不清楚您的代码正在尝试做什么,但是data[::-1]
会导致:
[0, 2, 2, 4, 2, 0, 0, 0, 0, 8, 2, 0, 8, 4, 2, 0]
与*
传递给zip
时等效于调用
zip(0, 2, 2, 4, 2, 0, 0, 0, 0, 8, 2, 0, 8, 4, 2, 0)
因此zip
的第一个参数是0
,并且由于zip
期望其所有参数都是可迭代的,因此会出现类型错误。