Python中的理解长度

时间:2016-01-15 22:39:26

标签: python list-comprehension

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]

我知道这个问题正处于编码和数学的十字路口,但我在这里要求的是它发生是一个有点普遍或众所周知的计算问题。因为我读过,理解被广泛使用。只有在这个意义上我才对这个问题感兴趣。根据迄今为止的评论,我的感觉是事实并非如此。

编辑:

例如,这是一种模式:如果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。暂时,长度=长度(x)*长度(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}

2 个答案:

答案 0 :(得分:2)

不,只有输入的长度这是不可能的。您可以使用数学通过计算公共素数因子来确定长度,但所涉及的工作不会仅仅计算结果并采用len来改进,并且它需要知道设置内容,而不仅仅是它们的长度

毕竟,只有长度,{2, 3}乘以{2, 3}(生成{4, 6, 9})无法区分{2, 3}乘以{10, 11},这将产生完全独特的产出(总共四个)。通过矛盾做出简单的证明;仅知道输入长度不足以确定输出长度,(2, 2)上的单个操作可能无法产生3和4而无需额外输入。

答案 1 :(得分:1)

  

例如,这是一个模式:如果x = {1,2,3},len(x * y)理解等于9提供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