3

リストがあります:

    k = [1,2,3,4,5]

今、このリストの3つの順列を別のリストにリストしたいのですが、これを行うと:

    x = []
    i = 0
    while i < 3:
        random.shuffle(k)
        x.append(k)
        i += 1

次のように、x の k の同じ順列の 3 倍になります。

    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
4

1 に答える 1

8

リストをシャッフルするとその場で変更され、同じリストへの 3 つの参照が作成されます。シャッフルする前にリストのコピーを作成します。

x = []
for i in range(3):
    kcopy = k[:]
    random.shuffle(kcopy)
    x.append(kcopy)

ループも単純化しました。そのまま使用してfor i in range(3)ください。または、これを完全なメソッドのコンテキストに配置するには:

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

set重複を取り除くためにa を使用することで、上記をさらに単純化できます。

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)
于 2012-07-01T14:14:32.360 に答える