Python 为什么可以';我不能像切一行一样切一列吗?
我有一个数独板作为列表Python 为什么可以';我不能像切一行一样切一列吗?,python,list,Python,List,我有一个数独板作为列表 board = [ ['.', 2, '.', '.', '.', 4, 3, '.', '.'], [9, '.', '.', '.', 2, '.', '.', '.', 8], ['.', '.', '.', 6, '.', 9, '.', 5, '.'], ['.', '.', '.', '.', '.', '.', '.', '.', 1], ['.',
board = [ ['.', 2, '.', '.', '.', 4, 3, '.', '.'],
[9, '.', '.', '.', 2, '.', '.', '.', 8],
['.', '.', '.', 6, '.', 9, '.', 5, '.'],
['.', '.', '.', '.', '.', '.', '.', '.', 1],
['.', 7, 2, 5, '.', 3, 6, 8, '.'],
[6, '.', '.', '.', '.', '.', '.', '.', '.'],
['.', 8, '.', 2, '.', 5, '.', '.', '.'],
[1, '.', '.', '.', 9, '.', '.', '.', 3],
['.', '.', 9, 8, '.', '.', '.', 6, '.'] ]
我可以很容易地检查某个值是否连续出现,
板[row][:]中的值
但我不能对列执行相同的操作。例如,当我在board[:][col]中写入值时,它会以某种方式选择行,用值col
索引,然后尝试查找指定的值
例如,print(board[6][:])
给出了[','8','2','5','5',','5','.]
(7行)和print(board[:][2])
给出了[','6','9','5'.]
(3行)。
我真搞不懂为什么会这样
我的问题是,是否有一个列的
board[row][:]
的等效语法?更重要的是,为什么board[:][col]
不起作用?等效语法是zip(*board)[2][:]
:
>>> zip(*board)[2][:]
('.', '.', '.', '.', 2, '.', '.', '.', 9)
>>> 2 in zip(*board)[2][:]
True
看
您的方法不起作用,因为board[:]
表示“所有行”,即与board
相同。所以board[:][2]
相当于board[2]
。您也不需要board[row][:]中的值中的[:]
部分
需要明确的是,[:]
语法通常用于@VPfB。由于您只是在阅读列表,所以这并不重要(事实上,由于您创建的是整个电路板的内存副本,因此效率较低)。您的困惑在于Python中索引是如何工作的。这可能会让事情变得明朗一点:
board=[
[".", 2, ".", ".", ".", 4, 3, ".", "."],
[9, ".", ".", ".", 2, ".", ".", ".", 8],
[".", ".", ".", 6, ".", 9, ".", 5, "."],
[".", ".", ".", ".", ".", ".", ".", ".", 1],
[".", 7, 2, 5, ".", 3, 6, 8, "."],
[6, ".", ".", ".", ".", ".", ".", ".", "."],
[".", 8, ".", 2, ".", 5, ".", ".", "."],
[1, ".", ".", ".", 9, ".", ".", ".", 3],
[".", ".", 9, 8, ".", ".", ".", 6, "."],
]
第一个=电路板[0]
秒=板[0][0]
#按预期打印行。
打印(第一)#['、2'、'、'、'、'、4、3'、'。]
#打印行[0]中索引的值。
打印(秒)#。
#通过遍历所有行的索引0中的值来查找实际列值。
列=[]
对于板中的行:
column.append(第[0]行)#第0行。
打印(列)#['、9'、'、'、'6'、'1'。]
如果使用NumPy,则可以轻松访问列值
>> board = numpy.array([
[".", 2, ".", ".", ".", 4, 3, ".", "."],
[9, ".", ".", ".", 2, ".", ".", ".", 8],
[".", ".", ".", 6, ".", 9, ".", 5, "."],
[".", ".", ".", ".", ".", ".", ".", ".", 1],
[".", 7, 2, 5, ".", 3, 6, 8, "."],
[6, ".", ".", ".", ".", ".", ".", ".", "."],
[".", 8, ".", 2, ".", 5, ".", ".", "."],
[1, ".", ".", ".", 9, ".", ".", ".", 3],
[".", ".", 9, 8, ".", ".", ".", 6, "."],
])
>> board[:,0]
>> array([".", 9, ".",".",".",6,".",1,"."])
您将板表示为行列表,因此无法直接访问特定列中的所有元素。您可以使用numpy数组或pandas数据帧来执行类似的操作。对于您的结构,您需要类似于value in[row[column]的值来表示线路板中的行]
或any(row[column]==线路板中的行的值)
@matthiastripp很棒。我现在明白了。谢谢这正是我想要的:)[row,col]=[6,4]打印(3 in[row[col]表示线路板中的row])
我认为应该注意的是,线路板[:]
与线路板
并不完全相同。这是一份副本。当程序只从中读取时,它的意思是相同的,但当它向其中写入时,它的意思是不一样的。@VPfB正确,感谢您的澄清。将这些信息整合到答案中。