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] >= 3
和 y[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
复杂得多
新 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] >= 3
和 y[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
复杂得多