我正在尝试编写一段代码,我知道在我的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也会覆盖它。 如何在不创建空白列表的情况下避免这种情况,并在我去的时候追加? (或者这是唯一的方法吗?)
答案 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
,您只复制对猜测列表的引用。因此,变量guess
和temp
都引用相同的列表对象。然后,当您执行temp[i] = j
时,您正在更改两个变量引用的列表对象的项目。因此,您正在更改原始猜测(使guess
的所有进一步检查不正确)。出于同样的原因,您还要将同一个对象附加到guess_list
列表中。要解决此问题,您必须创建guess
列表的副本;你可以使用temp = guess[:]
。
答案 2 :(得分:1)
temp = guess
将guess
的内容分配给名为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