Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 3.x 列表中的元素将被覆盖_Python 3.x - Fatal编程技术网

Python 3.x 列表中的元素将被覆盖

Python 3.x 列表中的元素将被覆盖,python-3.x,Python 3.x,我试图编写一个函数,创建独立向量列表的线性范围,但最后计算的向量似乎覆盖了所有其他元素。如果有人能帮我修一下,我会很高兴的 def span_generator(liste,n): """function to generate the span of a list of linear independent vectors(in liste) in the n-dimensional vectorspace of a finite field with charac

我试图编写一个函数,创建独立向量列表的线性范围,但最后计算的向量似乎覆盖了所有其他元素。如果有人能帮我修一下,我会很高兴的

def span_generator(liste,n):
    """function to generate the span of a list of linear independent 
    vectors(in liste) in the n-dimensional vectorspace of a finite 
    field with characteristic 2, returns a list of all elements which 
    lie inside the span"""
    results=[]
    blank=[]
    for i in range(n):
        blank.append(0)
    a=blank
    if len(liste)>1:
        listenwert=liste[-1]
        liste.pop(-1)
        values=span_generator(liste,n)    
        for i in range(2):
            for j in range(len(values)):
                for k in range(n):
                    a[k]=(i*listenwert[k]+values[j][k])%2
                results.append(a)
    else:       
        for i in range(2):
            for j in range(n):
                a[j]=(i*liste[0][j])
            results.append(a)    
    print(results)
    return results
打印(span_生成器([1,0],[0,1]],2))
给出以下结果

[[1, 0], [1, 0]]
[[1, 1], [1, 1], [1, 1], [1, 1]]
[[1, 1], [1, 1], [1, 1], [1, 1]]
而不是预期的:
[[0,0],[1,0],[0,1],[1,1]]

编辑:我试图用itertools.product简化程序,但没有解决问题

def span_generator(liste):
    n=len(liste[0])
    results=[]
    coeff=list(itertools.product(range(2), repeat=n))
    blank=[]
    for i in range(n):
        blank.append(0)
    for i in range(len(coeff)):
        a=blank
        for j in range(len(coeff[0])):
            for k in range(n):
                a[k]=(a[k]+coeff[i][j]*liste[j][k])%2
        results.append(a)
    return results
输出:
span_生成器([[0,1],[1,0]])
[[0,0],[0,0],[0,0],[0,0]]
但是它应该给出
[[0,0],[0,1],[1,0],[1,1]]

另一个例子:
span_生成器([[0,1,1],[1,1,0]])
应该给出
[[0,0,0],[0,1,1],[1,1,0],[1,0,1]]
(2=0,因为我正在计算模2)

系数 您可以使用
itertools.product
生成系数:

n = len(liste[0])
coefficients = itertools.product(range(2), repeat=len(liste))
生成包含以下内容的迭代器:

[(0, 0), (0, 1), (1, 0), (1, 1)]
线性组合 然后可以有选择地将结果与
列表的
转置相乘(
列表(zip(*liste))

对于每个维度(
范围(n)
)中的i,取乘积之和

def span_generator3(liste):
    n = len(liste[0])
    transpose = list(zip(*liste))
    coefficients = itertools.product(range(2), repeat=len(liste))
    for coeff in coefficients:            
        yield [sum((a * c) for a, c in zip(transpose[i], coeff)) % 2 for i in range(n)]
这将生成一个迭代器。如果希望结果以列表形式显示,只需在迭代器上执行
list()

结果 输出:

[[0, 0], [4, 8], [1, 2], [5, 10]]
[[0, 0, 0],
 [1, 2, 4],
 [8, 16, 32],
 [9, 18, 36],
 [64, 128, 256],
 [65, 130, 260],
 [72, 144, 288],
 [73, 146, 292]]
高维 输出:

[[0, 0], [4, 8], [1, 2], [5, 10]]
[[0, 0, 0],
 [1, 2, 4],
 [8, 16, 32],
 [9, 18, 36],
 [64, 128, 256],
 [65, 130, 260],
 [72, 144, 288],
 [73, 146, 292]]
模2 如果你想得到模2的结果,那就是在正确的位置加上2个字符

def span_generator3_mod2(liste):
    n = len(liste[0])
    transpose = list(zip(*liste))
    coefficients = itertools.product(range(2), repeat=len(liste))
    # print(list(itertools.product(range(2), repeat=len(liste))))
    for coeff in coefficients:            
        yield [sum((a * c) for a, c in zip(transpose[i], coeff)) % 2 for i in range(n)]
列表(span_generator3_mod2([0,1,1],[1,1,0]])
给出

[[0, 0, 0], [1, 1, 0], [0, 1, 1], [1, 0, 1]]

n
的含义是什么?如果我理解正确,您需要一个具有最大系数的开始向量的线性组合范围
n
?n给出向量中的条目数,因此实际上不需要将其传递给函数,因为它已经通过n=len(liste[0])与liste一起给出了因此对于
span_生成器([[a,b],[c,d]])
您希望结果是
[[0,0],[a,b],[c,d],[a+c,b+d]
]是的,这是正确的。我复制了您的代码并使用了您的示例,但对于“更高维度”,我得到了不同的输出。但是itertools.product应该可以解决我的问题。谢谢你,奇怪。那么你的结果是什么呢?我得到了[0,0,0,1,2,4],[2,4,8,16,32],[9,18,36],[10,20,40],[16,32,64],[17,34,68],[18,36,72],[64,128,256],[65,130,260],[66,132,264],[72,144,288],[73,146,292],[74,148,296],[80,160,320],[81,162,128,256],[82,164],[128,128,256],[515206],[25866],[136,272,544],[137,274,548],[138,276,552],[144,288,576],[145,290,580],[146,292,584]]作为结果,您可以在for循环之前添加一个
打印(系数)
打印(系数)
给出“”,
打印(列表(系数))
给出
[(0,0,0,1),(0,0,2),(0,1,0),(0,1,1)、(0,1,2)、(0,2,0)、(0,2,1)、(0,2,2)、(1,0,0)、(1,0,1)、(1,0,2)、(1,1,1)、(1,1,1)、(1,1,2)、(1,2,0)、(1,2,0)、(2,0,1)、(2,0,1)、(2,1,0)、(2,1,0)、(2,1,1)、(2,1,2)、(2,2,2,2,0)、(2,2,2)、(2,2,2,2)、(2,2,2)、(2,2)、(2,2,2)编码)
但它改变了(1,2,2,2,2,2,2,2,2,2,2,2,2)的输出(<3,2,2,2,2,2,2,2),2,2,2,2][2][2][2][2],[64128256]]))
[]
[[0, 0, 0], [1, 1, 0], [0, 1, 1], [1, 0, 1]]