2013-08-29 25 views
0

我想查找包含只有1和-1的四元素向量的所有组合。 (1,1,1,1),( - 1,1,1,1),...( - 1,-1,-1,-1)等 我的想法做到这一点是非常低效的im当然,但我想不出另一种方式来做到这一点,所以这就是我想要做的。 我发现有多少个总的向量,然后创建了许多空列表。我从矢量A开始,然后将其与vectors中的每个列表进行比较。如果A与任何列表匹配,我随机更改A元素的符号,然后再次检查新列表Avectors。如果A未找到匹配项,则将其替换为vectors中的列表,并将while循环递增1.这应该继续,直到找到并打印所有可能的组合。 但是,我的代码只是吐出vectors中的第一个更改,然后连续循环而不添加任何新的Avectors。任何人都可以发现我的代码中没有做到我打算做的和/或指向正确的方向吗?由于试图找到一个2状态向量(在python中)的所有组合

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 

哦,我再次意识到这种方法是非常低效的,但因为这是一个家庭作业,我更关心的是能够得到蟒蛇做我想做的事情,然后使用大量的建在功能上为我做工作。再次感谢。

回答

1
vectors[i] = A 

这并不创造A副本。当您更改A时,vectors的内容会更改,因为vectors[0]A是此行首次运行后的同一个对象。要解决此问题,请每次都创建一个新的A对象,或者复制A并将副本插入列表中。

如果你想制作一个副本,您可以用Python's slice notation

vectors[i] = A[:] 
+0

是的!就是这样!这是唯一的问题,现在它的工作。非常感谢 – user2727518

3

我想你可以用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)) 
+0

是的,我已经得到了这样的印象,我可以用'itertools'但我尽量不使用它,因为这将是太容易了。这项任务的目的是为了获得一些经验,如果使用 – user2727518

+0

好的感谢,这是好的食物,我会挑战性地看待'itertools'可以为未来的项目做什么 – user2727518

+0

第二个答案不使用itertools万一你没有注意到。 – Joohwan

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工作方式类似;)

相关问题