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]]