Python覆盖我的原始列表

时间:2014-05-02 23:54:15

标签: python list

我正在尝试编写一段代码,我知道在我的4个数字的组合中,3个位于正确的位置。我想迭代所有6个可能的数字并创建所有可能的迭代。 基本上,如果我有一个组合[1,2,3,4],我知道3处于正确的位置,我想生成: [2,2,3,4],[3,2,3,4],[4,2,3,4],[5,2,3,4],[6,2,3,4], [1,1,3,4-],[1,3,3,4-],[1,4,3,4],[1,5,3,4],[1,6,3,4], [1,2,1,4],等等...

我有这段代码可以生成所有可能的迭代[6,6,6,6]

def create_guess_list(guess):
guess_list = []
for i in range(0,4):
    for j in range(1,7):
        temp = guess
        if j != temp[i]:
            temp[i] = j
            guess_list.append(temp)
return guess_list

我假设每次创建新组合时,即使我将它放在临时列表中,Python也会覆盖它。 如何在不创建空白列表的情况下避免这种情况,并在我去的时候追加? (或者这是唯一的方法吗?)

4 个答案:

答案 0 :(得分:2)

复制列表的最简单方法是使用完整切片。改变这一行

temp = guess

到此

temp = guess[:]

如果您没有使用切片或其他方式复制列表,那么您有两个指向同一列表的变量。

答案 1 :(得分:2)

您可以使用itertools.product生成所有可能的组合,然后在没有足够数字匹配的地方过滤掉这些组合:

import itertools
def guess_list (guess, correct):
    for combination in itertools.product(range(1, 7), repeat=4):
        if sum(c == g for c, g in zip(combination, guess)) == correct:
            yield combination
>>> list(guess_list([1, 2, 3, 4], 3))
[(1, 1, 3, 4), (1, 2, 1, 4), (1, 2, 2, 4), (1, 2, 3, 1), (1, 2, 3, 2), (1, 2, 3, 3), (1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 3, 6), (1, 2, 4, 4), (1, 2, 5, 4), (1, 2, 6, 4), (1, 3, 3, 4), (1, 4, 3, 4), (1, 5, 3, 4), (1, 6, 3, 4), (2, 2, 3, 4), (3, 2, 3, 4), (4, 2, 3, 4), (5, 2, 3, 4), (6, 2, 3, 4)]

至于你的解决方案,问题在于你正在修改原始猜测。在temp = guess,您只复制对猜测列表的引用。因此,变量guesstemp都引用相同的列表对象。然后,当您执行temp[i] = j时,您正在更改两个变量引用的列表对象的项目。因此,您正在更改原始猜测(使guess的所有进一步检查不正确)。出于同样的原因,您还要将同一个对象附加到guess_list列表中。要解决此问题,您必须创建guess列表的副本;你可以使用temp = guess[:]

来做到这一点

答案 2 :(得分:1)

temp = guessguess的内容分配给名为temp的变量(两个变量都指向同一个对象)。

要创建独立副本,您应该从guess创建一个新列表,如下所示:

temp = list(guess)  # or temp = guess[:]

答案 3 :(得分:0)

from itertools import combinations, product

ALPHABET = [1, 2, 3, 4, 5, 6]
SAME = {a:[a] for a in ALPHABET}
DIFF = {a:[x for x in ALPHABET if x != a] for a in ALPHABET}

def all_possible_solutions(guess, num_right):
    # how many items need to be substituted?
    width = len(guess)
    num_wrong = width - num_right

    # which items should be substituted?
    for replace_at in combinations(range(width), num_wrong):

        # figure out new basis
        basis = [
            DIFF[g] if index in replace_at else SAME[g]
            for index,g in enumerate(guess)
        ]

        # return combinations from new basis
        for combo in product(*basis):
            yield combo