我有一个简单的生成器,可以给出一组坐标的排列。我希望使用下面的代码将每个新的排列保存到数组中的一个元素:
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
提供了一个数组,其中每个元素都是最后一个排列的副本。
有什么更好的方法可以做到这一点?
发布于 2013-07-16 23:07:48
您的生成器不会生成新的列表,它会一遍又一遍地生成相同的列表。当您将产生的引用附加到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())
https://stackoverflow.com/questions/17688435
复制