python,shuffle直到列表完全不同

时间:2015-11-24 18:21:00

标签: python list if-statement while-loop shuffle

我想问一下如何在一个while循环中进行随机播放,直到所有列表完全不同(如数独)?

#lists you want to shuffle
s1 = [1, 2, 3, 4]
s2 = [1, 2, 3, 4]
s3 = [1, 2, 3, 3]
s4 = [1, 2, 3, 4]

def mid_generator():

    while True:
        random.shuffle(s1)
        random.shuffle(s2)
        random.shuffle(s3)
        random.shuffle(s4)

        # if ... all lists are different...:
            #break

    return s1, s2, s3, s4

所以这个数字在第i行和第j列只有一次:

s1 = [3, 1, 2, 4]
s2 = [4, 2, 1, 3]
s3 = [2, 4, 3, 1]
s4 = [1, 3, 4, 2]

如果我尝试使用if s1 [0]!= s2 [0]的长if语句....输出错误。 也许你可以帮助我。

4 个答案:

答案 0 :(得分:1)

这仍然是一种效率低下的算法,因为它基于您的原始代码,但您可以将每个位置的元素放入集合中并检查它们的长度; len({1, 2, 3, 3})将为3,因为只有3个唯一元素:

import random

#lists you want to shuffle
s1 = [1, 2, 3, 4]
s2 = [1, 2, 3, 4]
s3 = [1, 2, 3, 4]
s4 = [1, 2, 3, 4]

def mid_generator():

    while True:
        random.shuffle(s1)
        random.shuffle(s2)
        random.shuffle(s3)
        random.shuffle(s4)

        test0 = {s1[0], s2[0], s3[0], s4[0]}
        test1 = {s1[1], s2[1], s3[1], s4[1]}
        test2 = {s1[2], s2[2], s3[2], s4[2]}
        test3 = {s1[3], s2[3], s3[3], s4[3]}

        if len(test0) == len(test1) == len(test2) == len(test3) == 4:
            break

    return s1, s2, s3, s4

交互式输出示例:

>>> mid_generator()
([3, 4, 2, 1], [1, 2, 4, 3], [4, 3, 1, 2], [2, 1, 3, 4])

答案 1 :(得分:1)

这很丑陋,但是如果你小心地将每个列中的每一列与每个列相比较,那么hookFooter()语句的长列表也可以正常工作:

and

答案 2 :(得分:1)

为了完整起见,这里是任意列表长度的通用版本:

for(int i = 0; i < cookies.length; i++){
    cn = cookies[ i ].getName();
    cv = cookies[ i ].getValue();
    cv = cv.concat(color);
    cookies[i].setValue(cv);
    response.addCookie(cookies[i]);
}

交互式:

def mid_generator(n):
    s = [list(range(1, n+1)) for x in range(n)]
    while True:
        for x in s:
            random.shuffle(x) 
        for i in range(n):
            test = {s[j][i] for j in range(n)}
            if len(test) != n:
                break
        else:
            return s
    return None # never hit

(还在等待......)

答案 3 :(得分:-1)

这会起作用 - 但它不是最佳的 - 但if检查会起作用

def mid_generator():

    while True:
        random.shuffle(s1)
        random.shuffle(s2)
        random.shuffle(s3)
        random.shuffle(s4)

        if not (s1 == s2 or s1 == s3 or s1 == s4 or s2 == s3 or s2 == s4 or s3 == s4):
            break

    return s1, s2, s3, s4