【问题标题】:Troubles with matrix in pythonpython中矩阵的问题
【发布时间】:2017-01-08 07:47:56
【问题描述】:

昨天,我试图用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 张牌。例如:甲板[1]+甲板[2]和甲板[2]+甲板[1]。但是这些行并没有像他们应该做的那样工作:

marker[i][j] = 1
marker[j][i] = 1

【问题讨论】:

标签: python list


【解决方案1】:

我可以推荐另一种使用标准 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 - 这种类型的计算真的很棒!

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 2014-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      相关资源
      最近更新 更多