3

我有一个简单的生成器来给我一组坐标的排列。我希望使用以下代码将每个新排列保存到数组中的元素:

import random
def poss_comb(coord):
    spin=random.shuffle
    if spin:
        spin(coord)
        yield (coord)
...

a=[]
for n in xrange(0,10):
    for item in poss_comb(coord):
        print item
        a.append(item)

然而,当打印结果时,打印item给了我我想要的:

['0 1', '', '1 2', '1 3']
['0 1', '', '1 2', '1 3']
['1 2', '0 1', '1 3', '']
['0 1', '1 2', '', '1 3']
['1 3', '', '1 2', '0 1']
['1 3', '1 2', '0 1', '']
['0 1', '', '1 3', '1 2']
['1 2', '0 1', '', '1 3']
['1 2', '1 3', '', '0 1']
['', '1 2', '1 3', '0 1']

而打印list a提供了一个数组,其中每个元素都是最后一个排列的副本。

有什么更好的方法来做到这一点?

4

1 回答 1

3

您的生成器不会产生的列表,它会一遍又一遍地产生相同的列表。当您附加该产生的引用时,a您只能一遍又一遍地看到相同的原始列表,它是最近改组的形式。

改为生成副本:

def poss_comb(coord):
    coord = coord[:]  # use a local copy of the list
    random.shuffle(coord)
    yield coord

或创建一个随机排序,而不是使用sorted()函数就地改组:

def poss_comb(coord):
    yield sorted(coord, key=lambda k: random.random())
于 2013-07-16T23:07:48.370 回答