在python中使用矩阵的麻烦

时间:2017-01-08 07:47:56

标签: python list

昨天,我试图解决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

2 个答案:

答案 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))

此外,有一天,您可能会因使用TrueFalse而非01而受益。因此,矩阵的初始化可能会像这样:

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为您提供了一种更适合此类问题的工具(排列列表)。