Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';我不能像切一行一样切一列吗?_Python_List - Fatal编程技术网

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正确,感谢您的澄清。将这些信息整合到答案中。