python中的“TypeError:zip参数#1必须支持迭代”

2024-04-25 08:27:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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()

每次运行此代码时,都会出现以下错误:

^{pr2}$

在这条线上:

data = zip(*data[::-1])

我已经看过其他人问过这个问题和答案,但我不能解决这个问题。在

有人能告诉我为什么我会遇到这个错误,以及我怎样才能修正这个错误。在


Tags: theinfordataifdefcount错误
2条回答

您的根本问题似乎是您认为您的drawBoard函数正在将draw从1D数组转换为2D数组。但事实并非如此。它所做的只是打印出draw的2D数组表示,根本不改变值。最后,你还有一张简单的老单子。在

尝试zip(*…)来转置一个1D数组(一组数字)是没有意义的。如果你有一个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))

现在,您可以将其用作二维数组,使其余代码更加简单:

^{pr2}$

如果你真的想让列表保持平坦,但是用zip(*…)翻转它,你可以把它弄平,翻转,然后再把它展平:

board = makeSquare(data)
flippedBoard = zip(*board[::-1])
flat = [col for row in flippedBoard for col in row]

顺便说一句,既然您一直在谈论数组,并试图将列表用作数组,那么您是否考虑过使用NumPy?即使出于某种原因,您想让所有内容保持平坦,NumPy也可以让您获得相同数据的重塑视图(无需复制任何内容,只需制作一个新的“查看器”句柄),您可以更轻松地对其进行操作:

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

现在还不清楚您的代码在这一点上要做什么,但是data[::-1]会导致:

[0, 2, 2, 4, 2, 0, 0, 0, 0, 8, 2, 0, 8, 4, 2, 0]

当用*传递给zip时,它相当于调用

^{pr2}$

所以zip的第一个参数是0,由于zip要求它的所有参数都是Iterable,所以得到一个类型错误。在

相关问题 更多 >