1

我正在尝试查找仅包含 1 和 -1 的四元素向量的所有组合。例如 (1,1,1,1),(-1,1,1,1),...(-1,-1,-1,-1) 等我想不出另一种方法来做到这一点,所以这就是我想要做的。我发现会有多少个总向量,然后创建了那么多空列表。我从 vector 开始A,然后将其与vectors. 如果A匹配任何列表,则我随机更改 元素的符号A,然后再次检查新列表Avectors如果A没有找到匹配项,则替换列表中的vectors,并且while循环增加1。这应该继续进行,直到找到并打印所有可能的组合。但是,我的代码只是吐出第一个更改,vectors然后不断循环而不添加任何新Avectors. 谁能发现我的代码中没有做我打算做的事情和/或指出我正确的方向?谢谢

import random
numvec = 2**4 # number of macrostates for a 4 component 2-state system

vectors = [[0,0,0,0] for i in range(numvec)] #initializing the numvec vectors 
A = [1,1,1,1]
i = 0
while i < 16:
    if any(x == A for x in vectors):
        y = random.randrange(0, 3)
        A[y] = A[y] * -1
    else:
        vectors[i] = A
        print vectors[i] 
        i += 1

print vectors

哦,我再一次意识到这种方法效率非常低,但由于这是一个家庭作业,我更关心能够让 python 做我想做的事情,然后使用一堆内置函数来为我完成工作. 再次感谢。

4

3 回答 3

4

itertools.product我认为您可以使用内置函数轻松完成此操作:

list(itertools.product([-1,1], repeat=4))

或者,您可以使用列表理解将其全部写出来。这更加冗长,但它避免使用该itertools库:

list((i,j,k,l) for i in (-1,1) for j in (-1,1) for k in (-1,1) for l in (-1,1))
于 2013-08-29T02:27:43.607 回答
1
vectors[i] = A

这不会创建A. 当你 changeA时,内容会vectors发生变化,因为vectors[0]A在此行第一次运行后是同一个对象。A要解决此问题,请每次创建一个新对象,或复制A并将副本插入到列表中。

如果要复制,可以使用Python 的切片表示法

vectors[i] = A[:]
于 2013-08-29T02:38:04.270 回答
0

出于教育目的(考虑到有类似问题的人可能正在寻找通用递归方法 - 一个经典任务)

def get_possibilities(elements, length=1):
    if length == 0:
        return [[]]

    if length > 0:
        tails = get_possibilities(elements, length=length-1)
        return [[x] + t for x in elements for t in tails]   

results = get_possibilities([1,-1], 4)

这是如何工作的示例:

[1,-1], length=4
call get_possibilities([1,-1],4) (main)
call get_possibilities([1,-1],3) (from get_possibilities)
call get_possibilities([1,-1],2) (from get_possibilities)
call get_possibilities([1,-1],1) (from get_possibilities)
call get_possibilities([1,-1],0) (from get_possibilities)

return [[]] (from the [1,-1], 0 call)

merge any element (here 1,-1, as list) with any element of the prior return
return [[1],[-1]] (from the [1,-1], 1 call)

merge any element (here 1,-1, as list) with the prior return
return [[1, 1], [1, -1], [-1, 1], [-1, -1]] (from the [1,-1], 2 call)

merge any element (here 1,-1, as list) with the prior return
return [[1, 1, 1], [1, 1, -1], [1, -1, 1]...] (8 elements, 2**3) (from the [1,-1], 3 call)

merge any element (here 1,-1, as list) with the prior return
return [[1, 1, 1, 1], [1, 1, 1, -1], ...] (16 elements 2**4) (from the [1,-1], 4 call)

问候

PS:我猜 itertools.product 的工作原理类似;)

于 2013-08-29T04:12:58.247 回答