结构、历史或哲学原因是否解释了为什么原生python只允许在列表理解的情况下对列表进行切片?

结构、历史或哲学原因是否解释了为什么原生python只允许在列表理解的情况下对列表进行切片?,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,为什么本机python不允许调用完整或部分列表 table=[list(range(10)),list(range(10)),list(range(10))] #calling the first column a=table[:][0] #calling a subset of table b=table[0:2][1:4] 而不是繁重和过于复杂的列表理解方法 a = [row[0] for row in table] b = [row[1:4] for row in table[0:2]]

为什么本机python不允许调用完整或部分列表

table=[list(range(10)),list(range(10)),list(range(10))]
#calling the first column
a=table[:][0]
#calling a subset of table
b=table[0:2][1:4]
而不是繁重和过于复杂的列表理解方法

a = [row[0] for row in table]
b = [row[1:4] for row in table[0:2]]
既然我们可以调用
c=table[1][0:3]
,为什么python不能轻松地调用
table[0:2][0:3]

是否有结构性的、历史性的或哲学性的原因允许仅使用列表理解进行切片?

使用列表理解是一种简单的方法

table[0:2][1:4]
不能满足您的需要,因为
table[0:2]
table
的前两个元素的列表,所以
[1:4]
从该列表中选取一部分,该部分仍然只包含
table
的元素。这两个都是二维列表上的切片操作,因此没有语义上的原因,一个切片应该返回一些未更改的行,而另一个切片应该返回所有行,但只返回一些列


Python没有在内置列表类型上包含这样一个操作的原因可能是,理解非常容易编写,阅读非常简单,可以理解它们的含义,并且对本机列表的多维切片的需求并不常见

还要注意的是,这是两种不同类型的“多维切片”——一种返回单个列作为一维列表,另一种返回新的二维列表。您希望切片列是一维的还是二维的取决于用例,如果内置的
list
类采取了一种“正确”的立场,那么对于一些期望其他行为的用户来说,这很容易导致问题

如果您需要元素的多维矩阵,该包支持多维切片的干净语法。无论如何,你可能已经在使用多维数据了,如果你不是,那么你应该考虑它。

导入numpy >>>m=numpy.array([list(range(10)),list(range(10)),list(range(10))])) >>>m[:,0] 数组([0,0,0]) >>>m[0:2,1:4] 数组([[1,2,3], [1, 2, 3]])
你是说除了通常的“单干”格言之外?对不起,你的评论有什么意义?你的意思是列表理解将是通常的方式?你就是这样做的,是吗?因为
list
对象不是多维数组,它们是列表,数据的异构容器。它们没有维度或形状之类的东西。列表只是许多用例中的一个,而不是语言设计师认为需要特殊用例的用例,所有这些问题的答案都是“因为语言设计师决定这么做。”如果你想要更好的答案,你应该问他们。