Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python random.shuffle()在while循环中_Python_Python 3.x - Fatal编程技术网

python random.shuffle()在while循环中

python random.shuffle()在while循环中,python,python-3.x,Python,Python 3.x,我有一份清单: k = [1,2,3,4,5] 现在我想在另一个列表中列出此列表的3个排列,但当我这样做时: x = [] i = 0 while i < 3: random.shuffle(k) x.append(k) i += 1 而不是我想要的,像这样的东西: x = [[1,3,5,2,4], [1,3,5,2,4], [1,3,5,2,4]] x = [[1,5,4,2,3],

我有一份清单:

    k = [1,2,3,4,5]
现在我想在另一个列表中列出此列表的3个排列,但当我这样做时:

    x = []
    i = 0
    while i < 3:
        random.shuffle(k)
        x.append(k)
        i += 1
而不是我想要的,像这样的东西:

    x = [[1,3,5,2,4], [1,3,5,2,4], [1,3,5,2,4]]
    x = [[1,5,4,2,3], [1,3,5,2,4], [5,3,4,1,2]]
请注意,这是不可能的,因为收集k中的数据的方式将k放置在循环中,因为我知道这将解决问题。真正的代码是:

    def create_random_chromosomes(genes):
        temp_chromosomes = []
        chromosomes = []
        i = 0
        while i < 2000:
            print(genes)
            random.shuffle(genes)
            temp_chromosomes.append(genes)
            i += 1
        print(temp_chromosomes)
        for element in temp_chromosomes:
            if element not in chromosomes:
                chromosomes.append(element)
        return chromosomes
def创建随机染色体(基因):
温度=[]
染色体=[]
i=0
而我<2000:
印刷品(基因)
随机。洗牌(基因)
临时染色体附加(基因)
i+=1
打印(温度)
对于temp_染色体中的元素:
如果元素不在染色体中:
染色体。附加(元素)
返回染色体

无序移动列表会将其更改到位,您将创建对同一列表的3个引用。在洗牌之前创建列表的副本:

x = []
for i in range(3):
    kcopy = k[:]
    random.shuffle(kcopy)
    x.append(kcopy)
我也简化了你的循环;只需对范围(3)中的i使用
。或者,将其放在完整方法的上下文中:

def create_random_chromosomes(genes):
    temp_chromosomes = []
    chromosomes = []
    for i in range(2000):
        print(genes)
        randomgenes = genes[:]
        random.shuffle(randomgenes)
        temp_chromosomes.append(randomgenes)
    print(temp_chromosomes)
    for element in temp_chromosomes:
        if element not in chromosomes:
            chromosomes.append(element)
    return chromosomes
通过使用删除重复项,可以进一步简化上述操作:

def create_random_chromosomes(genes):
    chromosomes = set()
    randomgenes = genes[:]
    for i in range(2000):
        random.shuffle(randomgenes)
        chromosomes.add(tuple(randomgenes))
    return list(chromosomes)
这使用随机基因列表的元组副本来适应集合内容的约束

然后,您甚至可以确保返回2000个独特的项目,无论:

def create_random_chromosomes(genes):
    chromosomes = set()
    randomgenes = genes[:]
    while len(chromosomes) < 2000:
        random.shuffle(randomgenes)
        chromosomes.add(tuple(randomgenes))
    return list(chromosomes)
def创建随机染色体(基因):
染色体=集合()
随机基因=基因[:]
而len(染色体)<2000:
随机。洗牌(随机基因)
染色体。添加(元组(随机基因))
退货清单(单张)

谢谢,效果很好,我已经尝试过做同样的事情,但在制作副本时没有将“[:]”添加到k中,因此它不起作用,那么添加“[:]”到底有什么作用呢?
[:]”
的意思是:将列表中的所有元素(从开始到结束)作为新列表提供给我。将其与
[:10]
[10://code>进行比较;省略起始或结束数字会将它们设置为默认值0和len(list)。您也可以使用
list(k)
而不是
k[:]
@AshwiniChaudhary:大多数python开发人员使用
[:]
,因为它是
list(…)的一半字符
。在循环之外创建列表的单个副本,然后继续(重新)洗牌,似乎效率更高。。。