Python 中的理解长度

Length of comprehensions in Python

新 Python,所以请...

刚刚遇到 comprehensions 我知道它们很快可能会分支成点积或矩阵乘法(尽管结果是一个集合这一事实使它们更有趣),但此时我想问一下是否有任何公式可以确定推导式的长度,例如:

{x * y for x in {3, 4, 5} for y in {4, 5, 6}}.

显然我不是指这个特定的:

len({x * y for x in {3, 4, 5} for y in {4, 5, 6}}) = 8,但是这种类型的任何一般操作,对两个集合进行逐元素乘法,并将结果整数的集合作为结果(无重复),对于任何给定的 x 和 y 长度、连续整数和已知的 x[1] 和 y[1].

我知道这个问题处于编码和数学的十字路口,但我在这里问它是因为它 碰巧 有点常见,或者很好-known computational issue,因为我读到理解被广泛使用。只有在这个意义上,我才对这个问题感兴趣。根据目前的评论,我的感觉是情况并非如此。

编辑:

例如,这里有一个模式:如果 x = {1, 2, 3}len(x * y) 推导等于 9,前提是 y[1] = or > 3。例如,len({x * y for x in {1, 2, 3} for y in {1111, 1112, 1113}}) = 9。所以暂定,length = length(x) * length(y),前提是x和y的元素没有重叠。它适用于 4 元素集吗?当然:len({x * y for x in {1, 2, 3, 4} for y in {1111, 1112, 1113, 1114}}) = 16。其实整数不需要连续,只要不重叠:len({x*y for x in {11,2,39} for y in {3,4,5}}) = 9即可。

而且,是的,它不起作用...检查一下:

{x * y for x in {0, 1, 3} for y in {36, 12, 4}} = {0, 4, 12, 36, 108}

不,仅凭输入的长度这是不可能的。您可以使用数学通过计算公共质因数来确定长度,但是所涉及的工作不会仅计算结果并取 len 来改进,并且它需要了解集合内容,而不仅仅是它们的长度.

毕竟,仅凭长度,{2, 3} 乘以 {2, 3}(产生 {4, 6, 9})与 {2, 3} 乘以 [=15= 无法区分],这将产生完全独特的输出(总共四个)。通过反证法进行简单证明;仅知道输入长度不足以确定输出长度,(2, 2) 上的单个操作不可能在没有额外输入的情况下同时产生 3 和 4。

For instance, here is a pattern: If x = {1, 2, 3} the len(x * y) comprehensions is equal to 9 provided y[1] = or > 3

(我认为你的意思是 y[1] >= 3y[1] 作为集合中的最小元素,因为根据定义集合没有顺序)

对于具有连续元素和空交集的 2 个大小为 3 的集合,满足您的条件 y[1]>=3,这里是反例

{x*y for x in {1,2,3} for y in {4,5,6}}

因为这是集合,总是有可能 length(A)*length(B) 的元素较少并且取决于 A 和 B 的内容,但您可以找到值

的范围

min(length(A),length(B)) <= length(A*B) <= length(A)*length(B)

要在不计算的情况下找到 A * B 的实际值,您必须做更多的检查,这比只做 A * B

复杂得多