昨天,我试图解决python的问题,我遇到了一些非常奇怪的事情:
# create matrix
for i in range(N):
tmp.append(0)
for i in range(N):
marker.append(tmp)
# create sum of 2 first cards
for i in range(N) :
for j in range(N):
if i != j and marker[i][j] == 0:
comCard.append(deck[i]+deck[j])
taken[deck[i]+deck[j]] = [i,j]
marker[i][j] = 1
marker[j][i] = 1
我的想法是,我想要计算牌组中每对牌的所有可能总和(这些牌需要不同),所以我认为使用标记,我可以避免再次计算相同的2张牌。例如:deck [1] + deck [2]和deck [2] + deck [1]。但是这些线路并没有像他们应该做的那样工作:
marker[i][j] = 1
marker[j][i] = 1
答案 0 :(得分:2)
我可以推荐使用标准python模块的另一种方式:
# suppose this is a deck - list of cards (I don't know how to mark them :)
>>> deck = ['Ax', 'Dy', '8p', '6a']
>>> from itertools import combinations
# here's a list of all possible combinations of 2 different cards
>>> list(combinations(deck, 2)))
[('Ax', 'Dy'), ('Ax', '8p'), ('Ax', '6a'), ('Dy', '8p'), ('Dy', '6a'), ('8p', '6a')]
您可以使用此列表:检查某些组合等。
我建议关注图书馆itertools - 对于这种类型的计算真的很棒!
答案 1 :(得分:0)
您使用tmp
的同一个实例,仅使用shallow-copied。这就是为什么它不起作用。您需要在每个矩阵中添加每行的新副本。
这可以通过以下方式完成:
marker.append(list(tmp))
此外,有一天,您可能会因使用True
和False
而非0
和1
而受益。因此,矩阵的初始化可能会像这样:
tmp = list()
marker = list()
for i in range(N):
tmp.append(False)
for j in range(N):
marker.append(list(tmp))
这样,当您尝试marker[i][j] = True
时,只会影响索引(i,j)。
话虽如此,Eugene Lisitsky's answer为您提供了一种更适合此类问题的工具(排列列表)。