python - python中的'TypeError:zip参数#1必须支持迭代'
问题描述
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
在这条线上:
data = zip(*data[::-1])
我已经看过其他提出这个问题和答案的人,但我无法解决这个问题。
有人可以告诉我为什么会收到此错误以及如何解决此问题。
解决方案
您的根本问题似乎是您认为您的drawBoard
函数正在draw
从一维数组转换为二维数组。但事实并非如此。它所做的只是打印出的二维数组表示draw
,根本不改变值。最后,您仍然只有一个普通的旧平面列表。
尝试zip(*…)
转置一维数组(数字列表)是没有意义的。如果您有一个二维数组(数字列表的列表),那将是有意义的。你认为你有一个二维数组,这就是为什么你对你的代码不起作用感到困惑的原因。
因此,显而易见的解决方案是让自己成为一个可以使用的列表列表。如果你想要一个将板子变成列表列表的函数,你必须写一个——但这很容易。有关对列表元素进行分块或分组的各种方法,请参阅此问题,然后选择您喜欢的那个。然后:
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 也可以让您获得相同数据的重塑视图(无需复制任何内容,只需创建一个新的“查看器”句柄),您可以更轻松地对其进行操作:
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
推荐阅读
- wordpress - 使用带有倒计时 JS 的 ACF 日期时间选择器。WordPress
- ruby - Net::HTTP 和 Nokogiri - nil:NilClass (NoMethodError) 的未定义方法“body”
- google-cloud-firestore - Firestore:为地图值创建索引
- sql - 使用 SQL 进行多重连接
- django - Django:是否可以排除视图中的字段?
- java - Java中基于正则表达式的字符串拆分
- javascript - 使用 Webpack 4 在 Javascript 中导入 JSON 文件
- loops - 用循环让单词下去 - 飞镖编程语言
- asp.net-core - 有没有办法在 SignalR Core Hub 中实现事件?
- python - “python.exe 在...中找不到 '__main__' 模块”尝试在虚拟环境中运行 python 脚本 opencv_blink_detect.py 时出错,